2017-01-31 4 views
-1

ich eine Metadatendatenrahmen haben, die wie folgt aussieht:R Funktionen anwenden wie in Metadaten Datenrahmen auf bestimmte Spalten der verschiedenen Datenrahmen definiert

tablename variable  applicablefunction 
table1  address_key  myfunc1   
table1  address_key  myfunc2   
table1  zipcode   myfunc1      
table2  address_key  myfunc3      

Tabelle 1

address_key zipcode 
234567  560100 
123456  560100 
453678  560100 

Tabelle 2 sieht aus wie

wie

aussieht
address_key zipcode 
234567  560100 
123456  560100 
453678  560100 

Ist es möglich, Ausgabe im unteren Format zu erhalten?

tablename variable  applicablefunction functionOutput 
table1  address_key  myfunc1   98.5 
table1  address_key  myfunc2   67.2 
table1  zipcode   myfunc1   100.0 
table2  address_key  myfunc3   22.8 

Früher habe ich versucht, mit:

lapply(as.character(metadata$tablename), function(dfname) metadata$applicablefunction(get(dfname))) 

Aber es scheint nicht zu funktionieren!

Ich habe auch versucht

do.call(metadata$applicablefunction, metadata$tablename) 

Aber ich denke, ich bin nicht auf dem richtigen Weg! Vielen Dank im Voraus für die Hilfe.

+0

Wenn 'Tabelle 1 ',' Tabelle 2 'und' möglich Tabelle X' alle die gleiche Struktur (wie in Ihrem Beispiel) haben, 'rbind()' ing sie zu einem 'Daten .frame' mit einer zusätzlichen Spalte, die angibt, ob die Daten von "Tabelle 1" oder "Tabelle 2" stammen, würde dies etwas einfacher machen. Vielleicht könnten Sie klären, ob es eine Voraussetzung ist, dass "Tabelle 1" und "Tabelle 2" einzelne Objekte sein müssen. – ottlngr

+3

Ja, es ist möglich. – Roland

+0

Hallo @ottlngr, Ihr Ansatz würde auch funktionieren. Table1, Table2, ... Tablex kann mit einer zusätzlichen Spalte verknüpft werden, die angibt, ob die Daten aus Tabelle 1 oder Tabelle 2 oder Tabelle x stammen. Ist es möglich, die obige Ausgabe dann zu bekommen? –

Antwort

2

Ok, ich habe selbst ein reproduzierbares Beispiel gemacht. Dies kommt in der Nähe zu dem, was für Sie gefragt (bevor Sie den Beitrag aktualisiert):

rbind die einzelnen Tabellen:

t1 <- data.frame(table = "Table1", 
       address_key = c(234567, 123456, 45678),  
       zipcode = c(560100, 560100, 560100)) 
t2 <- data.frame(table = "Table2", 
       address_key = c(234567, 123456, 45678), 
       zipcode = c(560100, 560100, 560100)) 

t <- rbind(t1, t2) 

Es ist Ihre Meta-Tabelle (I zur Demonstration explizite Funktionen übernehmen):

meta <- data.frame(tablename = c("Table1", "Table1", "Table1", "Table2"), 
        variable = c("address_key", "address_key", "zipcode", "address_key"), 
        applyFun = c("sum", "mean", "sum", "median"), 
        value = NA) 

dann die Schleife durch die Reihen und verwenden if ... else die gewünschten Funktionen anzuwenden:

for (i in 1:dim(meta)[1]) { 
    sub <- t[t$table == meta[i, ]$tablename, as.character(meta[i, ]$variable)] 
    res <- if (meta[i,]$applyFun == "sum") { 
    sum(sub) 
    } else if (meta[i,]$applyFun == "mean") { 
    mean(sub) 
    } else if (meta[i,]$applyFun == "median") { 
    median(sub) 
    } 
    meta[i,]$value <- res 
} 

Dies gibt:

tablename variable applyFun value 
1 Table1 address_key  sum 403701 
2 Table1 address_key  mean 134567 
3 Table1  zipcode  sum 1680300 
4 Table2 address_key median 123456 
+1

Vielen Dank. Es wirkt wie ein Zauber. Ich werde sicher stellen, dass ich das nächste Mal richtig poste. Ich muss viel lernen und bin dabei. Danke für die Bestätigung. –

+2

Das ist bis zum Kreisverkehr. Verwenden Sie einfach 'getFunction (meta [i,] $ applyFun) (sub)' anstelle Ihrer 'if'-Bedingungen. – Roland

+0

Tatsächlich sind explizite Funktionsnamen in 'meta $ applyFun' angegeben (wie in meinem Beispiel). – ottlngr

Verwandte Themen