相关疑难解决方法(0)

有效地计算data.table列的线性组合

nc在data.table中有列,nc在向量中有标量.我想采用列的线性组合,但我不知道我将使用哪些列.最有效的方法是什么?

建立

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

n  <- 1e5
nc <- 5
cf <- setNames(rnorm(nc),LETTERS[1:nc])
DT <- setnames(data.table(replicate(nc,rnorm(n))),LETTERS[1:nc])
Run Code Online (Sandbox Code Playgroud)

做到这一点的方法

假设我想使用前四列.我可以手动写:

DT[,list(cf['A']*A+cf['B']*B+cf['C']*C+cf['D']*D)]
Run Code Online (Sandbox Code Playgroud)

我可以想到两种自动方式(在不知道应该全部使用AE的情况下工作):

mycols <- LETTERS[1:4] # the first four columns
DT[,list(as.matrix(.SD)%*%cf[mycols]),.SDcols=mycols]
DT[,list(Reduce(`+`,Map(`*`,cf[mycols],.SD))),.SDcols=mycols]
Run Code Online (Sandbox Code Playgroud)

标杆

我希望as.matrix做第二个选项慢,实在是没有直觉的速度Map- Reduce组合.

require(rbenchmark)
options(datatable.verbose=FALSE) # in case you have it turned on

benchmark(
    manual=DT[,list(cf['A']*A+cf['B']*B+cf['C']*C+cf['D']*D)],
    coerce=DT[,list(as.matrix(.SD)%*%cf[mycols]),.SDcols=mycols],
    maprdc=DT[,list(Reduce(`+`,Map(`*`,cf[mycols],.SD))),.SDcols=mycols]
)[,1:6]

    test replications elapsed relative user.self sys.self
2 coerce          100    2.47    1.342      1.95     0.51
1 manual          100    1.84    1.000      1.53     0.31 …
Run Code Online (Sandbox Code Playgroud)

performance r linear-algebra data.table

7
推荐指数
1
解决办法
2052
查看次数

标签 统计

data.table ×1

linear-algebra ×1

performance ×1

r ×1