2016-12-30 3 views
1

Ich erstelle mehrere Teilmengen einer Datenquelle, die dann auf verschiedene Arten grafisch dargestellt und in eine PDF ausgegeben wird. Ich habe eine for-Schleife erstellt, um alles zu erstellen und die Daten zu manipulieren. Wenn ich jedoch versuche, eine Teilmenge zu erzeugen, sind die zurückgegebenen Datensätze leer. Ich habe ein einfaches Beispiel erstellt, das das Problem zeigt, das ich unten habe.Filter Datentabelle in einer Liste von Listen

Gibt es eine andere Art, darüber nachzudenken?

id <- c(rep("a",20),rep("c",10),rep("d",10),rep("e",20),rep("f",20),rep("g",20)) 
x <- rnorm(n=100, mean=1323, sd=6.432) 
dt <- data.table(id, x) 

class1 <- c("a","e","g") 
class2 <- c("c","F") 
class3 <- c("b","d") 

classes <- list(class1,class2,class3) 

dtNames <- c("c1","c2","c3") 

#this doesn't work 
for(i in 1:length(classes)){ 
    assign(dtNames[i],dt[dt$id %in% classes[i],]) 
} 

#this does work 
assign(dtNames[1],dt[dt$id %in% class1]) 
+0

Es ist besser, nicht mehrere Objekte in der globalen Umgebung zu erstellen – akrun

+0

Es ist besser, Listen von data.frames zu erstellen, anstatt assign zu verwenden. In @gregors Beitrag zu [dieser Frage] (http://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames) finden Sie Tipps zum Erstellen und Arbeiten mit solchen Objekten. – lmo

Antwort

1

Wir brauchen [[ zu verwenden, um die list Elemente

for(i in seq_along(classes)){ 
    assign(dtNames[i], dt[id %chin% classes[[i]]]) 
} 

Hinweis zu extrahieren: Es ist besser, nicht mehrere Objekte im globalen Umfeld zu schaffen.

+1

Ich benutze nicht den Befehl assign in meinem tatsächlichen Code, ich werfe nur den gefilterten Datensatz in eine Liste, die ich dann abholen, um durch andere Funktionen zu laufen. Danke für Ihre Hilfe! –