数据 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])]
我尽量不使用 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])]