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

列表中的列名/data.R表中的多列条件,r,data.table,subset,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 显然没有用 欢迎指点 DT[,colNames]尝试从DT中提取名为colNames的列。要将colNames作为列名向量,可以使用.colN

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
显然没有用


欢迎指点

DT[,colNames]
尝试从
DT
中提取名为
colNames
的列。要将
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

另外两个选择:

与=FALSE一起使用

DT[rowSums(DT[, colNames, with=FALSE] != 0) > 0]
或者使用
mget

DT[rowSums(DT[, mget(colNames)] != 0) > 0]

我们可以使用
Reduce
+

DT[DT[, !Reduce(`+`, lapply(.SD, `!=`, 0)), .SDcols = colNames]]
#   a b c d e
#1: 1 0 0 0 0

为完整起见,还有一种
data.table
方法,通过编程方式使用变量列连接到子集:

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]
助手表
mDT
如下所示:


此方法也适用于其他
mDT
,例如

mDT <- CJ(a = 3:4, b = 2:3) # cross join

或者
.SDcols
-
DT[DT[,行和(.SD!=0)==0,.SDcols=colNames],]
谢谢您的回答。由于某种原因,
运算符在我的情况下不起作用。其余的都是。将验证第二个答案,因为它更干净、更通用。很好,因为它可以轻松修改以适应任何条件(与其他解决方案相反,由于我的问题,它特别关注
==0
   a b c d e
1: 1 0 0 0 0
   b c d e
1: 0 0 0 0
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