列表中的列名/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