2015-04-01 15 views
5

Das fühlt sich an wie eine wirklich einfache Frage, aber seine Lösung hat mich für etwa 90 Minuten des Versuchens, Suchens und Lesens von Handbüchern und online entzogen.Programmatische Teilmenge einer Data.table in R

sagen, dass ich eine data.table haben:

DT<-data.table(a=runif(n = 10),b=runif(n = 10),c=runif(n = 10)) 

eindeutig so etwas wie dies funktioniert:

DT[a > 0.5] 

und gibt mir die Teilmenge von DT, wo die Werte in der Spalte "a" größer als 0,5. Aber was, wenn ich etwas flexibler sein möchte (weil die Teilmenge in eine größere Routine eingebettet ist).

Was würde ich tun möchte, ist diese Proto-Funktion verwenden können:

flexSubset<-function(sColumnToSubset,dMin){ 
subs<-DT[sColumnToSubset>dMin] 
return(subs) 
} 

Ich habe ohne Erfolg versucht, unter vielen anderen ...

with=FALSE 

Irgendwelche Vorschläge? Vielen Dank für Ihre Zeit im Voraus!

+1

Ich denke, das 'DT [eval (parse (text = sColumnToSubset)) nicola

Antwort

8

Wenn Sie eine Zeichenfolge übergeben wollen, dann tun Sie dies:

flexSubset = function(sColumnToSubset, dMin) 
       DT[get(sColumnToSubset) > dMin] 

flexSubset("a", 0.5) 

Wenn Sie einen unevaluierten Ausdruck übergeben wollen, dann:

flexSubset = function(sColumnToSubset, dMin) { 
       lhs = substitute(sColumnToSubset) 
       DT[eval(lhs) > dMin] 
      } 

flexSubset(a, 0.5) 
flexSubset(a/b, 0.5) 
+0

Fantastisch! Vielen Dank!!! – russfx

Verwandte Themen