我有一個data.table和公式的列表,應用公式的列表至R data.table
DT <- data.table(A = c(1:3), B = c(3:1), C = c(4:6), D = (6:4))
l <- list(f1 = "A + B", f2 = "B + C", f3 = "C - D", f4 = "D/A")
這可以通過
DT[, ":="(f1 = A + B, f2 = B + C, f3 = C - D, f4 = D/A)]
或
for (i in 1:length(l)) {
DT[, eval(names(l)[i]) := eval(parse(text=l[[i]]))]
}
可以實現
有沒有辦法使用l
中的信息來做到這一點,而不使用循環?
# some code
DT
# A B C D f1 f2 f3 f4
# 1: 1 3 4 6 4 7 -2 6.000000
# 2: 2 2 5 5 4 7 0 2.500000
# 3: 3 1 6 4 4 7 2 1.333333
這裏的循環有什麼問題?並非所有循環都不好。 – dayne
我只想知道是否有辦法避免循環... –
您可以使用'lapply'來避免循環遍歷列,但通常使用循環並不總是一件大事,就像dayne所說的那樣。首先,我猜你應該將這些表達式存儲爲表達式,而不是文本:'L = lapply(l,function(x)parse(text = x))''。然後,像DT [,\':= \'(名字(L),LAPLLY(L,EVAL,.SD))]'',這是有效的,但我不確定是否是猶太教。 – Frank