我的data.table dt0
是:
ANSWER1 ANSWER2 ANSWER3 ANSWER4 ANSWER5 ANSCOUNT SCORE100
21 37 16 14 11 200784 61
20 37 16 15 11 177165 60
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]
}
谢谢。
这是错误。如何理解它以及如何正确地做?
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).
最佳答案
要回答总体问题-“何时以及如何在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
说明:
Map
从100-to-0
到相应的ANSWER1:ANSWER5
列的权重因子,然后使用Reduce
函数一起将它们一起+
。换句话说,100*ANSWER1 + 75*ANSWER2 + 50*ANSWER3 ...
等。然后使用相同的
Reduce
和+
形成方程的分母。我认为
ANSCOUNT
的乘法是没有意义的,因为在分子和分母中都是如此。关于r - 什么时候以及如何在data.table中使用as.name()vs.get()(例如在循环列中)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56122667/