2017-06-22 9 views
0

erstellen Ich möchte dynamisch Teilmengen meiner data.table basierend auf den Werten in einigen Spalten erstellen.R dynamische Teilmenge von data.table

In meiner data.table habe ich die folgenden Variablen: Besitzer, 2G, 3G, 4G. 2G, 3G, 4G sind binär.

Ich möchte drei Teilmengen erstellen: eine mit 2G == 1, eine mit 3G == 1, eine mit 4G == 1.

Beispiel:

a=c("Paul",1,1,0) 
b=c("George",1,0,0) 
x=cbind(a,b) 
colnames(x)=c("Owner","2G","3G","4G") 

Hier ist mein Code:

all_names_df=c() 

for(value in 2:4){ 
    techno=paste0(value,"G") 
    name=paste0("arcep",techno) 
    all_df=c(all_names_df,name) 
    df=arcep[techno==1] 
    assign(name,df) 
} 

Mein neues data.tables erstellt werden, aber leer. Ich habe mehrere Dinge ausprobiert (mit eval, Zitat, ändere die Syntax etc ...), aber ich kann nicht richtig die Spalte aufrufen.

EDIT:

Ich habe etwas anderes versucht, aber es scheitert auch:

techno=c("2G","3G","4G") 
for(value in techno){ 
index=grep(value,colnames(arcep)) 
print(index) 
set1=subset(arcep,arcep[,index]==1) 
print(dim(set1)) 
assign(set1,paste0("ARCEP_",value))} 

Error in `[.data.table`(arcep, , index) : 
    j (the 2nd argument inside [...]) is a single symbol but column name 'index' is not found. Perhaps you intended DT[,..index] or DT[,index,with=FALSE]. This difference to data.frame is deliberate and explained in FAQ 1.1. 

Warum es nicht sagt "'Spaltenname 'index' gefunden wird nicht"? Warum wird nicht der Wert von "index" berücksichtigt? Eval-Index ändert nichts.

+0

Ich habe etwas anderes versucht: – Oolis

+0

Sie arbeiten mit einer 'data.table', also' arcep [, index] 'ist äquivalent zu' arcep [["index"]] ''. Was versuchst du auch mit 'assign' zu tun? –

Antwort

-1

Ich fand schließlich die Antwort:

for(value in techno){ 
    set1=subset(arcep,arcep[,get(colnames(arcep)[grep(value,colnames(arcep))])]==1) 
    assign(paste0("ARCEP_",value),set1) 
} 
2

Vektoren und Matrizen können nicht sowohl Zahlen als auch Zeichen enthalten, in Ihrem Fall werden Zahlen in Zeichen umgewandelt.

Dies wird besser arbeiten, um Ihre Tabelle zu definieren, aber Spaltennamen können mit einer Zahl in einem data.frame nicht starten

x <- data.frame(Owner = c("Paul","George"), 
       G2 = c(1,1), 
       G3 = c(1,0), 
       G4 = c(0,0), 
       stringsAsFactors= FALSE) 

dann ist hier Ihre Teilmenge

subset(x,G3 == 1) 

(Sie auch habe cbind anstelle von rbind in deiner Frage benutzt, möchtest du es möglicherweise bearbeiten)

+0

Danke, aber es löst nicht mein "dynamisches" Problem ... – Oolis