数据 table 中包含许多列的子集行

subset rows in data table with many columns

我尽量不使用 data.table 对行进行计算,因为这是不可取的。我想对具有许多列的大 data.table 的值大于或等于 2 的所有行进行子集化,然后可能还会获取这些列。

可重现的例子:

 DT <- as.data.table( rbind( diag(5)+1, diag(5), rep(0,5)) )
 DT[1,1] = 1

我的代码:

DT[,lapply(.SD, function(x) x>=2 )]

我得到了一个 data.table 布尔值,现在很困惑我应该如何对其进行子集化。

@IRTFM 提到的一种有效方法是:

DT[DT[,apply(.SD, 1, function(x) any(x>=2))]]

    V1 V2 V3 V4 V5
1:  1  2  1  1  1
2:  1  1  2  1  1
3:  1  1  1  2  1
4:  1  1  1  1  2

现在我还应该如何对具有 2 值的列进行子集化??

理想的结果是:

      V2 V3 V4 V5
1:    2  1  1  1
2:    1  2  1  1
3:    1  1  2  1
4:    1  1  1  2

我无法让您的示例加载到我的控制台会话中,但这是一个更“最小”的示例;演示方法的示例。不过不确定它是否具有通常的 data.table 效率:

DT <- setDT( data.frame(x=1:2, y=0,z=0))
DT[, apply(.SD, 1, function(x){any(x>=2)}) ] gets you a logical vector for each row
# [1] FALSE  TRUE
DT[ DT[, apply(.SD, 1, function(x){any(x>=2)}) ]] # uses that vector to select rows
   x y z
1: 2 0 0

这也应该成功:

DT[ as.logical(rowSums(DT >= 2))]
   x y z
1: 2 0 0

对于第二部分,请考虑以下内容:

cols <- sapply(DT, function(x){ any(x>0)})
DT2[ ,.SD, .SDcols=names(cols[cols])]