2015-04-29 52 views
1

定義我下面data.table過濾行通過標準的變量

structure(list(val1 = c(1, 2, 1, 3, 4, 5, 3), val2 = c(4, 5, 6, 4, 2, 4, 5)), .Names = c("val1", "val2"), row.names = c(NA, -7L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0xedae28>) 

我想這樣做是爲了過濾基於其他變量定義的標準,它的行。例如,我可能需要所有具有val1 >= 1的行。這很容易爲

x[val1 > 1,] 

完成然而,我希望能夠指定列名(即或者val1val2)作爲變量和過濾器值作爲變量。我試過

cname = 'val1' 
cutoff = 1 
x[(cname >= cutoff),] # Try 1 
x[(cname) >= (cutoff),] # Try 2 
x[eval(cname > cutoff),] # Try 3 

但它只是給了原來的data.table

+0

名單,但所有的答案都是超長和/或者不要使用'get',這是最簡單的:http://stackoverflow.com/q/24833247/1191259 – Frank

+0

@Frank,你真的花時間閱讀那個鏈接的問題? :-) – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto並不完全,但超過了我應該擁有的:)我有一種感覺,這是一個愚蠢的行爲,但我喜歡這個問答比任何一個都好。這是我自己的問題在同一件事情:http://stackoverflow.com/q/19276194/1191259我想每個人都問過這個問題。 – Frank

回答

6

這聽起來像你正在尋找get

x[get(cname) > cutoff,] 
# val1 val2 
# 1: 2 5 
# 2: 3 4 
# 3: 4 2 
# 4: 5 4 
# 5: 3 5 
+0

工程很好。謝謝! – broccoli

3

你可以使用eval與相關的問題as.nameas.symbol

x[eval(as.name(cname)) > cutoff] 
# val1 val2 
#1: 2 5 
#2: 3 4 
#3: 4 2 
#4: 5 4 
#5: 3 5 
+0

也適用。 get方法看起來更乾淨。 – broccoli