2017-06-29 60 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])] 
相關問題