R 如何选择多列作为行选择的条件
比如说,R 如何选择多列作为行选择的条件,r,data.table,R,Data.table,比如说, set.seed(1984) d <- data.table(name=letters[1:26],a=rbinom(26,1,0.5),b=rbinom(26,1,0.5),c=rbinom(26,1,0.5)) 结果是: a b c name 1: 1 1 1 a 2: 1 1 1 u 3: 1 1 1 x 4: 0 1 0 b 5: 0 1 0 d 6: 0 1 0 h 7: 0 1 1 c 8: 0 1 1
set.seed(1984)
d <- data.table(name=letters[1:26],a=rbinom(26,1,0.5),b=rbinom(26,1,0.5),c=rbinom(26,1,0.5))
结果是:
a b c name
1: 1 1 1 a
2: 1 1 1 u
3: 1 1 1 x
4: 0 1 0 b
5: 0 1 0 d
6: 0 1 0 h
7: 0 1 1 c
8: 0 1 1 g
9: 0 1 1 o
10: 0 1 1 q
11: 0 1 1 t
12: 1 1 0 e
13: 1 1 0 k
14: 1 1 0 y
15: 1 0 0 f
16: 1 0 0 i
17: 1 0 0 r
18: 1 0 0 s
19: 1 0 0 w
20: 0 0 1 j
21: 0 0 1 v
22: 1 0 1 m
23: 1 0 1 n
a b c name
现在,我有两个问题:
如果不是sum(具有处理行的rowSums版本),而是max等其他函数,如何解决问题1和问题2而不使用apply函数族(apply函数族是为数据帧设计的,我担心它们会降低数据表的速度) 我们可以使用
Reduce
和+
根据.SDcols
中指定的列创建逻辑向量
d[d[, Reduce(`+`, .SD) != 0, .SDcols = a:c]]
其他选项包括(@nicola's) 或者按照@Frank的建议,使用
pmax
根据每行上的最大值创建列(“keep”),将其从二进制文件转换为逻辑文件,并基于该子集创建行和列
d[, keep := as.logical(do.call(pmax, .SD)), .SDcols=!"name"][(keep), !"keep"]
我们可以使用Reduce
和+
来根据.SDcols
中指定的列创建逻辑向量
d[d[, Reduce(`+`, .SD) != 0, .SDcols = a:c]]
其他选项包括(@nicola's)
或者按照@Frank的建议,使用pmax
根据每行上的最大值创建列(“keep”),将其从二进制文件转换为逻辑文件,并基于该子集创建行和列
d[, keep := as.logical(do.call(pmax, .SD)), .SDcols=!"name"][(keep), !"keep"]
您还可以使用rowSums
函数:
d[rowSums(d[,2:4])!=0,]
您还可以使用rowSums
函数:
d[rowSums(d[,2:4])!=0,]
类似于d[d[,rowSums(.SD)!=0.SDcols=a:c]
?类似于d[d[,rowSums(.SD)!=0.SDcols=a:c]
?同样d[Reduce(“+”,d[,a:c])!=0]
似乎有效(不使用.SDcols
)。考虑到它们是二进制变量,pmin或pmax似乎更自然。我会做d[,keep:=as.logical(do.call(pmax.SD)),.SDcols=!“name”[(keep),!“keep”]
或类似的操作。另外d[Reduce(“+”,d[,a:c])!=0]
似乎可以工作(不使用.SDcols
)。考虑到它们是二进制变量,pmin或pmax看起来更自然。我会做d[,keep:=as.logical(do.call(pmax.SD)),.SDcols=!“name”][(keep),!“keep”]
或类似的操作。我陷入了DT[I,j,by]的陷阱,并将函数T_TAm应用到DT包中,效果不太好。。还在学习呢。随着时间的推移,我将能够拿起。我掉进了DT[I,j,by]的陷阱,并应用函数T_TAm,但DT包不太好。。还在学习呢。随着时间的推移,我将能够拿起。