data.table中的列表/多列条件中的列名称R

时间:2017-11-24 02:58:54

标签: r data.table subset

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

我想选择列bcde==0的行,而不假设我事先知道列名。所以使用colNames <- c('b','c','d','e')向量。

我试过

DT[all(DT[,colNames]==0)]
显然无济于事。

欢迎任何指示!

3 个答案:

答案 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