我的data.table dt0是:
ANSWER1 ANSWER2 ANSWER3 ANSWER4 ANSWER5 ANSCOUNT SCORE100
21 37 16 14 11 200784 61
20 37 16 15 11 177165 60
Run Code Online (Sandbox Code Playgroud)
ANSWERx是百分比。SCORE100计算为 SCORE100 := (100*ANSWER1*ANSCOUNT + 75*ANSWER2*ANSCOUNT + 50*ANSWER3*ANSCOUNT + 25*ANSWER4*ANSCOUNT) / (ANSWER1*ANSCOUNT + ANSWER2*ANSCOUNT + ANSWER3*ANSCOUNT +ANSWER4*ANSCOUNT + ANSWER5*ANSCOUNT)]
为了重新计算SCORE100在我的数据集的所有行,我需要自动(在循环中)乘法ANSWERx通过ANSCOUNT 在每一行中,然后加入所有获得的乘法和然后通过所有的总和划分ANSCOUNT。
您可以帮忙吗,大致如下:
for (c in paste0("ANSWER",1:5)) {
dt0[, as.name(paste0(c,"_t")):= as.name(c)*"ANSCOUNT", , with=T]
}
Run Code Online (Sandbox Code Playgroud)
谢谢。
这是错误。如何理解它以及如何正确地做?
Error in `[.data.table`(dt0, , `:=`(as.name(paste0(c, "_t")), as.name(c) * :
LHS of := must be a symbol, or an atomic vector (column names or positions).
Run Code Online (Sandbox Code Playgroud)
要回答总体问题-“ 何时以及如何在data.table中使用as.name()vs.get()? ”。
以我的经验,当您可以使用现有的R编程方法时,几乎不需要它:
一种与其他方法(现已删除)类似的功能方法:
dt0[,
newcol := Reduce(`+`, Map(`*`, c(100,75,50,25,0), .SD)) / Reduce(`+`, .SD),
.SDcols = ANSWER1:ANSWER5
]
# ANSWER1 ANSWER2 ANSWER3 ANSWER4 ANSWER5 ANSCOUNT SCORE100 newcol
#1: 21 37 16 14 11 200784 61 60.85859
#2: 20 37 16 15 11 177165 60 60.10101
Run Code Online (Sandbox Code Playgroud)
说明:
Map权重因子从100-to-0到相应的ANSWER1:ANSWER5列,然后Reduce使用+函数将它们组合在一起。换句话说,100*ANSWER1 + 75*ANSWER2 + 50*ANSWER3 ...等等
然后使用Reduce并+形成方程的分母。
我认为乘积ANSCOUNT是无意义的,因为在分子和分母中都是如此。