我有一个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