【问题标题】:How to compute the linear combination of different columns within R data.table如何计算 R data.table 中不同列的线性组合
【发布时间】:2017-06-29 18:05:55
【问题描述】:

我有一个 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]

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

【问题讨论】:

  • 鉴于你的问题,没有更好的办法
  • 在这种情况下,使用矩阵可能会更好。这是基础 R 中的一种方法。`myMat rowSums(myMat[, 1:4] * myMat[, 5:8]) 计算点积。
  • 这些不是线性组合。如果有人根据标题登陆这里,正确的参考是我的问题,我猜stackoverflow.com/questions/19279075/…

标签: r data.table


【解决方案1】:

一个选项是

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

【讨论】:

    【解决方案2】:

    dplyr:

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

    【讨论】:

      【解决方案3】:

      假设您需要一个更好的方法,因为您可能并不总是每个都有 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])]
      

      【讨论】:

        猜你喜欢
        • 2013-10-17
        • 2014-11-10
        • 1970-01-01
        • 2014-08-09
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多