2016-07-26 5 views
1

Ich wiederhole die Spalten in einem Datenrahmen (es ist auch eine Datentabelle später in meinem Code). In SQL, das entspricht, was ich will für jede Variable tun wie folgt aussieht:data.table SELECT GROUP BY Spaltenindex in R?

SELECT COUNT(VAR) FROM df GROUP BY MonthYear 

ich einige Probleme, die in R tun Sache, though. Die Datei, die ich habe, ist schlecht strukturiert, so habe ich eine Art von dplyr + data.table Workaround Ich versuche, funktional zu bekommen.

library(dplyr) 
library(data.table) 

df <- data.frame(MonthYear = c("JAN15", "JAN15", "FEB15", "MAR15", "MAR15"), V1 = c(1,1,0,0,0), V2 = c(0,1,1,1,0), V3 = c(0,0,0,1,1), V4 = c(0,1,1,1,1)) 

for(colNum in 2:length(names(df))){ 
    colName <- names(df)[colNum] 
    filtered <- select(df, c(1, colNum)) 
    filtered_dt <- data.table(filtered, key = "MonthYear") 
    trimmed <- filtered_dt[, count = sum(colName), by = key(filtered_dt)] 
} 

Daraus resultiert und Fehler:

Error in sum(column) : invalid 'type' (character) of argument

Für V1, ich weiß, die trimmed Zuordnung soll wie folgt aussehen:

trimmed <- filtered_dt[, count = sum(V1), by = key(filtered_dt)] 

Ich weiß nur nicht, wie das Zeichen zu bekommen Wert von "V1", um diese Syntax anzupassen.

+0

Sie haben einen Tippfehler. Wickle das 'count = sum (colName)' in '.()'. Dies ist in der FAQ: https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-faq.html#unused-arguments-mysum-sumv Nicht sicher, ob das dein einziges Problem ist. – Frank

+0

Das beantwortet meine Frage aber immer noch nicht. Ich bekomme den gleichen Fehler. Wie kann ich den 'character'' "V1" -Wert in dieser "getrimmten" Linie arbeiten lassen? – blacksite

+0

Sorry, ich wollte nicht vorschlagen, dass es deine Frage beantwortet hat. – Frank

Antwort

3

Frage ist verwirrend, Sie verwenden SQL count(var) während im Code, und vorausgesetzt, Beispiel sieht es so aus, als ob Sie sum(var) verwenden möchten. Mit count(var) werden alle Nicht-NULL-Elemente einschließlich Duplikate gezählt.
Angenommen, Sie Ihre Variablen von Monat sum wollen, dann Lösung in Michael Kommentar ist eine effiziente und saubere Antwort:

library(data.table) 
df <- data.frame(MonthYear = c("JAN15", "JAN15", "FEB15", "MAR15", "MAR15"), V1 = c(1,1,0,0,0), V2 = c(0,1,1,1,0), V3 = c(0,0,0,1,1), V4 = c(0,1,1,1,1)) 
setDT(df) 
df[ , lapply(.SD, sum), by = MonthYear] 
# MonthYear V1 V2 V3 V4 
#1:  JAN15 2 1 0 1 
#2:  FEB15 0 1 0 1 
#3:  MAR15 0 1 2 2 

Im Fall, wenn Ihre Beispieldaten gut sind nicht Ihr Problem Einpassen und Sie wirklich wollen SQLs count(var) dann verwenden Sie einfach df[, lapply(.SD, function(x) sum(!is.na(x))), by = MonthYear], dies zählt Nicht-NA-Elemente nach Gruppe.