如何计算R data.table中不同列的线性组合

时间:2017-06-29 18:05:56

标签: r data.table

我有一个data.table,并希望采用列的线性组合。 我该怎么办?

设置

require(data.table)
set.seed(1)

DT <- data.table(A = rnorm(10),
                 B = rnorm(10),
                 C = rnorm(10),
                 D = rnorm(10),
                 coefA = rnorm(10),
                 coefB = rnorm(10),
                 coefC = rnorm(10),
                 coefD = rnorm(10))

我可以做以下事情:

DT[, sum := A*coefA + B * coefB + C * coefC + D * coefD]

有没有更好的方法来解决这个问题?

3 个答案:

答案 0 :(得分:3)

一个选项是

DT[ sum := Reduce(`+`, DT[, 1:4] * DT[, 5:8])]

或使用.SD

DT[, sum := Reduce(`+`, .SD[, 1:4] * .SD[, 5:8])]

或者我们可以做到

nm1 <- names(DT)[1:4]
nm2 <- paste0("coef", nm1)
DT[, sum := Reduce(`+`, Map(`*`, mget(nm1), mget(nm2)))]

答案 1 :(得分:0)

使用dplyr

DT %>% mutate(sum = A*coefA + B * coefB + C * coefC + D * coefD)

答案 2 :(得分:0)

假设你需要一个更好的方法,因为你可能并不总是有4个,只要排序正确添加E,F,G; coefE,coefF,coefG ......

coefcols <- names(DT)[grepl("coef", names(DT))]
valucols <- names(DT)[!grepl("coef", names(DT))]
DT[, sum := apply(DT[, ..valucols] * DT[, ..coefcols], 1, sum)]

编辑:在阅读@ lmo的评论后,我意识到可以使用rowSums简化最后一行:

DT[, sum := rowSums(DT[, ..valucols] * DT[, ..coefcols])]