2017-10-04 70 views
0

假設dt是一個data.table對象,其列ABCR data.table處理混淆變量名稱的一行語句

我想在列循環過濾掉一些行,然後在該列應用功能:

for(col in c("A", "B", "C")){ 
    dt[col %in% some_filter[[col], col := some_function(col), with=FALSE] 
} 

哪裏some_filter是包含一些有效值list,例如some_filter[["A"]] = c("just", "an", "example")

但是通過參考col這4個位置,data.table似乎弄亂了命名空間並且失敗了。

通過臨時變量有一個解決方法,但如何在一行中執行此任務?

一個不工作的代碼是:

library(data.table) 
library(dplyr) 
dt <- data.table(A=1:10, B=11:20, C=21:30) 
f <- list() 
f[["A"]] <- 3:5 
f[["B"]] <- 14:18 
f[["C"]] <- 28:29 
for(col in colnames(dt)){ 
    dt[col %in% f[[col]], col := col * 2, with=F] # Double up some rows 
} 
+1

你能預期的輸出增加的問題。也許你想要的是'get(col)'在data.table中調用 – dww

+0

是的,請用實況(即示例函數)填寫'f'並添加預期的輸出。 – lukeA

回答

3

我們可以用get從含有其名稱的字符變量訪問列。 ()周圍的:=的LHS還優選使用with = F

for(col in colnames(dt)){ 
    dt[get(col) %in% f[[col]], (col) := get(col) * 2L] # Double up some rows 
} 

#  A B C 
# 1: 1 11 21 
# 2: 2 12 22 
# 3: 6 13 23 
# 4: 8 28 24 
# 5: 10 30 25 
# 6: 6 32 26 
# 7: 7 34 27 
# 8: 8 36 56 
# 9: 9 19 58 
# 10: 10 20 30 
1

另一種選擇是使用set

for(nm1 in names(dt)) { 
    i1 <- which(dt[[nm1]] %in% f[[nm1]]) 
    set(dt, i= i1, j = nm1, value = dt[[nm1]][i1]*2L) 
} 
dt 
#  A B C 
# 1: 1 11 21 
# 2: 2 12 22 
# 3: 6 13 23 
# 4: 8 28 24 
# 5: 10 30 25 
# 6: 6 32 26 
# 7: 7 34 27 
# 8: 8 36 56 
# 9: 9 19 58 
#10: 10 20 30