【问题标题】:subset rows in data table with many columns具有多列的数据表中的子集行
【发布时间】:2022-01-01 15:55:48
【问题描述】:

我正在尽力不使用 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

【问题讨论】:

  • 我认为这样可以为每一列获得一个逻辑向量。你试过 apply(.SD, 1, function(x){any(x>=2)}) 在 i 位置吗?
  • 这里是一个更紧凑的例子的代码:DT &lt;- as.data.frame( rbind( diag(5)+1, diag(5), rep(0,5)) ) 现在你的工作就是指定你想要从中返回什么。你目前的描述对我来说似乎不准确。
  • ok 更新了问题

标签: r datatable


【解决方案1】:

我无法让您的示例加载到我的控制台会话中,但这是一个更“最小值”;演示方法的示例。不确定它是否具有通常的 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])]

【讨论】:

  • 我不想对行求和,只需检查data.table 中的数据点是否大于或等于2,并可能还对子集之后出现的列进行子集化。像 x y z 2 0 0 但只有 x
  • 对不起,示例太大,无法正确加载,您是对的。
  • 另一个疑问是,在您制作的这个示例中,我们无法真正逃脱以通过行操作,因为 apply 正在这样做
  • 我没有对行求和。我正在测试这些行是否有任何大于 2 的值。所以第二次尝试是错误的。我以为您想要任何值实例大于或等于 2 的行。您只想要具有该特征的任何实例的列吗?
  • 不,我想要任何实例的值大于或等于 2 的行,但如果可能的话,只返回该实例出现的列。所以这个DT[ DT[, apply(.SD, 1, function(x){any(x&gt;=2)}) ]] 只返回x 列,非常感谢。我被 data.table 中的语法绊倒了
猜你喜欢
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 2011-01-24
  • 2016-06-01
  • 2019-10-27
相关资源
最近更新 更多