我的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
我需要自动(循环)将每一行中的所有ANSWERxANSCOUNT相乘,然后将所有获得的乘法相加,然后除以所有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

说明:
Map100-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/

10-12 22:20