我有一个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]
有没有更好的方法来解决这个问题?
答案 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])]