R .SD列上的data.table子集条件?
我想创建与下面的最小可复制示例相同的结果,但您可以看到最后一个代码的子集条件基本上是删除行,其中.SD列不应全部为零R .SD列上的data.table子集条件?,r,data.table,R,Data.table,我想创建与下面的最小可复制示例相同的结果,但您可以看到最后一个代码的子集条件基本上是删除行,其中.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 !
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]
我们可以使用
Reduce
i1 <- t1[, .I[Reduce(`|`, lapply(.SD, `!=`, 0))], .SDcols = V1: V9]
out2 <- t1[i1, lapply(.SD, sum), by = id]
i1我们可以使用Reduce
i1 <- t1[, .I[Reduce(`|`, lapply(.SD, `!=`, 0))], .SDcols = V1: V9]
out2 <- t1[i1, lapply(.SD, sum), by = id]
i1使用rowSums()
:
使用rowSums()
:
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
t1[t1[, rowSums(.SD != 0) > 0, .SD = patterns("V\\d")]
][, lapply(.SD, sum), by = id]