【问题标题】:data.table subset condition on .SD columns?.SD 列上的 data.table 子集条件?
【发布时间】:2019-09-24 17:35:41
【问题描述】:

我想创建与以下最小可重现示例相同的结果,但您可以看到最后一个代码的子集条件基本上是删除 .SD 列不应全为零的行。

library(dplyr)

library(data.table)

set.seed(1)

t1 <- sample(-1:1, 999999, replace = T) %>% matrix(ncol = 9) %>% as.data.table %>% {cbind.data.frame(id = 1:nrow(.), .)}

t1[V1 != 0|V2 != 0|V3 != 0|V4 != 0|V5 != 0|V6 != 0|V7 != 0|V8 != 0|V9 != 0, lapply(.SD, sum), by = id]

我试过了

t1[sum(abs(.SD)) != 0, lapply(.SD, sum), by = id]

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以用Reduce创建i

    i1 <- t1[, .I[Reduce(`|`, lapply(.SD, `!=`, 0))], .SDcols = V1: V9]
    out2 <- t1[i1, lapply(.SD, sum), by = id]
    

    -检查 OP 的输出

    out1 <- t1[V1 != 0|V2 != 0|V3 != 0|V4 != 0|V5 != 0|V6 != 0|V7 != 0|V8 != 0|V9 != 0, lapply(.SD, sum), by = id]  
    identical(out1, out2)
    #[1] TRUE
    

    【讨论】:

      【解决方案2】:

      使用rowSums():

      t1[t1[, rowSums(.SD != 0) > 0, .SD = patterns("V\\d")]
         ][, lapply(.SD, sum), by = id] 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        相关资源
        最近更新 更多