data.table
中相当新手,所以我必须遗漏一些明显的东西。
DT <- data.table(a=1:4,b=c(0,1,2,3),c=c(0,2,0,3),d=c(0,3,2,1),e=c(0,8,5,3))
a b c d e
1: 1 0 0 0 0
2: 2 1 2 3 8
3: 3 2 0 2 5
4: 4 3 3 1 3
我想选择列b
,c
,d
和e
为==0
的行,而不假设我事先知道列名。所以使用colNames <- c('b','c','d','e')
向量。
我试过
DT[all(DT[,colNames]==0)]
显然无济于事。
欢迎任何指示!
答案 0 :(得分:1)
DT[,colNames]
尝试从colNames
中提取名为DT
的列。要将colNames
作为列名称的向量,您可以使用..colNames
,然后使用rowSums
逐行检查条件:
DT[rowSums(DT[, ..colNames] != 0) > 0]
# a b c d e
#1: 2 1 2 3 8
#2: 3 2 0 2 5
#3: 4 3 3 1 3
如果选择b,c,d,e
列全部为零的行:
DT[rowSums(DT[, ..colNames] != 0) == 0]
# a b c d e
#1: 1 0 0 0 0
另外两个选择:
使用with=FALSE
:
DT[rowSums(DT[, colNames, with=FALSE] != 0) > 0]
或使用mget
:
DT[rowSums(DT[, mget(colNames)] != 0) > 0]
答案 1 :(得分:1)
我们可以将Reduce
与+
DT[DT[, !Reduce(`+`, lapply(.SD, `!=`, 0)), .SDcols = colNames]]
# a b c d e
#1: 1 0 0 0 0
答案 2 :(得分:0)
为了完整起见,还有一种data.table
方法,使用 join 以编程方式按变量列进行子集化:
library(magrittr) # just for convenience
# create helper table with selection criteria to join with
mDT <- colNames %>% length() %>% rep(0, .) %>% as.list() %>% as.data.table() %>% setnames(colNames)
# join to subset
DT[mDT, on = names(mDT), nomatch = 0L]
a b c d e 1: 1 0 0 0 0
帮助程序表mDT
如下所示:
b c d e 1: 0 0 0 0
此方法也适用于其他mDT
,例如
mDT <- CJ(a = 3:4, b = 2:3) # cross join
a b 1: 3 2 2: 3 3 3: 4 2 4: 4 3
DT[mDT, on = names(mDT), nomatch = 0L]
a b c d e 1: 3 2 0 2 5 2: 4 3 3 1 3