2017-06-29 33 views
1

我有一个data.table,并希望采取列的线性组合。 我该怎么做?如何计算R数据中不同列的线性组合。表

的设置

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

鉴于你的问题,没有就没有更好的办法 – statquant

+0

在这种情况下,你'可能会更好工作与矩阵。这里有一个方法可以在base R.'myMat < - as.matrix(DT)'中转换为一个矩阵,然后'rowSums(myMat [,1:4] * myMat [,5:8])'来计算点产品。 – lmo

+0

那些不是线性组合。如果有人根据标题登陆这里,正确的ref是我的问题,我猜https://stackoverflow.com/questions/19279075/efficiently-computing-a-linear-combination-of-data-table-columns – Frank

回答

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)))] 
0

随着dplyr

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

假设你需要一个更好的方法,因为你可能并不总是有各自的4,下面就只要排序是添加E,F,G正确的工作; coefE,_系数,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])] 
相关问题