2016-10-19 3 views
2

Ich arbeite an Microsoft SQL Management Studio 2016, mit der Funktion, die mich ein R-Skript in den SQL-Code hinzufügen. Meine Ziele sind, eine aPriori-Algorithmus-Prozedur zu erreichen, die die Daten in einer Art und Weise bringt, die ich mag, d. H. Eine Tabelle mit x, erstem Objekt, y, zweitem Objekt.SQL-Server und R, Data Mining

Ich stecke hier fest, weil ich meiner Meinung nach ein Problem in Daten habe. Der Fehler ist das.

A 'R' Skript-Fehler beim Ausführen von 'sp_execute_external_script' mit HRESULT 0x80004004.

Ein externes Skript Fehler aufgetreten: Fehler in eval (ausdr, envir, enclos) : schlechte Zuordnung von Anrufen: Quelle -> withVisible -> eval -> eval -> .Call

Hier mein Code. Die Quelldaten sind eine Tabelle von zwei Spalte wie folgt aus:

A B 
a f 
f a 
b c 
... 
y z 

Und hier der Code:

GO 
    create procedure dbo.apriorialgorithm as 

-- delete old table 
IF OBJECT_ID('Data') IS NOT NULL 
    DROP TABLE Data 

-- create a table that store the query result. 
CREATE TABLE Data (art1 nvarchar(100), art2 nvarchar(100)); 

-- store the query 
INSERT INTO Data (art1, art2) 
select 
    firstfield as art1, 
    secondfield as art2 
    from allthefields 
    ; 

IF OBJECT_ID('output') IS NOT NULL 
    DROP TABLE output 
-- create table of the results of the analysis. 

CREATE TABLE output (x nvarchar(100), y nvarchar(100)); 

INSERT INTO output (x, y) 
-- R script. 
EXECUTE sp_execute_external_script 
       @language = N'R' 
       , @script = N' 

Nun ist die R-Skript. Die Daten, die ich von der Abfrage bekomme, sind numerisch, aber für das Apriori brauche ich Faktoren, also verbiege ich zuerst die Daten zu factor;

     df<-data.frame(x=as.factor("art1"),y=as.factor("art2")) 

Dann kann ich die apriori gelten:

     library("arules"); 
         library("arulesViz"); 

         rules = apriori(df,parameter=list(minlen=2,support=0.05, confidence=0.05)); 

Ich brauche die Daten ohne das Format der Regeln, sondern einfach die Objekte:

     ruledf <- data.frame(
           lhs <- labels(lhs(rules)), 
           rhs <- labels(rhs(rules)), 
           [email protected]) 

         a<-substr(ruledf$lhs,7,nchar(as.character(ruledf$lhs))-1) 
         b<-substr(ruledf$rhs,7,nchar(as.character(ruledf$rhs))-1) 

         ruledf2<-data.frame(a,b) 
         ' 

Und der letzte Teil:

   , @input_data_1 = N'SELECT * from Data' 
       , @output_data_1_name = N'ruledf2' 
       , @input_data_1_name = N'ruledf2'; 

GO 

Ich weiß nicht, wo ich fa bin I ling, weil die gleichen Dinge in R mit RODBC zu tun, um die db-Daten zu fangen, ist alles in Ordnung. Können Sie mir helfen? Danke im Voraus!

Antwort

2

Das Problem war hier:

Der R-Skript ist besser so:

EXECUTE sp_execute_external_script 
       @language = N'R' 
       , @script = N'     

         library("arules"); 

         rules = apriori(df[, c("art1", "art2")], parameter=list(minlen=2,support=0.0005, confidence=0.0005)); 

         ruledf <- data.frame(
           lhs <- labels(lhs(rules)), 
           rhs <- labels(rhs(rules)), 
           [email protected]) 

         ruledf2<-data.frame(
           lhs2<-substr(ruledf$lhs,7,nchar(as.character(ruledf$lhs))-1), 
           rhs2<-substr(ruledf$rhs,7,nchar(as.character(ruledf$rhs))-1) 
              ) 

         colnames(ruledf2)<-c("a","b") ' 

Dann braucht es die richtige Eingabe und Ausgabe haben:

 , @input_data_1 = N'SELECT * from Data' 
     , @input_data_1_name = N'df' 
     , @output_data_1_name = N'ruledf2' 

So ist das Ergebnis Gehen Sie zu einer Tabelle namens Ausgang wie folgt

x y 
artA artB 
artB artA 
... 
artY artZ 

Sehr hilfreich dabei: https://msdn.microsoft.com/en-us/library/mt604368.aspx

Verwandte Themen