我想计算数据框每一行中满足多重OR条件的列数。
在数据框的前100列中,我有“代码”(即整数)。假设我想要数值为111,112或113的列数。
我试过
rowSums(mydata[,1:100]==111 | mydata[,1:100] == 112 | mydata[,1:100] == 113)
这行得通,但是由于我要检查的代码很多,所以我宁愿使用%in%语句,例如
rowSums(mydata[,1:100] %in% c(111,112,113))
但这不起作用,而且我找不到合适的语法。(我查看了有关%in%的其他问题,但没有找到解决我问题的答案。)
问题的第二部分是,如何在其他列上添加AND条件?就像是
rowSums(mydata[,1:100] %in% c(111,112,113) & mydata[,101:200] %in% c("a","b","c"))
?
该%in%
运营商不工作data.frame
。我们可以使用来遍历各列lapply/sapply/vapply
并执行%in%
。在获得a中的逻辑索引之后list
,我们使用来获得元素级和(+
)Reduce
。这也将工作,即使有NA
值%in%
的用途match
与参数nomatch=0L
,同时==
返回NA
的NA
值。
Reduce(`+`, lapply(mydata[1:5], `%in%` ,111:113))
#[1] 2 3 2 4 2 1 3 0 1 2 1 2 1 2 0 1 1 3 2 2
等于 rowSums
rowSums(mydata[1:5] ==111 | mydata[1:5] == 112 | mydata[1:5] == 113)
#[1] 2 3 2 4 2 1 3 0 1 2 1 2 1 2 0 1 1 3 2 2
对于问题的第二部分,我们可以构造&
with Map
,然后使用Reduce
来获取+
。
我们使用两个逻辑list
s(lapply(mydata[1:5], ...)
和lapply(mydata[6:10], ...)
)作为的输入Map
。在&
将比较相应的list
元素,并返回TRUE
如果两者都TRUE
否则FALSE
返回单list
。从那里,我们可以Reduce
按照之前所述使用。
Reduce(`+`, Map(`&`, lapply(mydata[1:5], `%in%` ,111:113),
lapply(mydata[6:10], `%in%`, letters[1:3])))
#[1] 0 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 2 1 0
等效rowSums
代码为
rowSums((mydata[1:5] ==111 | mydata[1:5] == 112 | mydata[1:5] == 113) &
(mydata[6:10]=='a' | mydata[6:10]=='b' | mydata[6:10]=='c'))
#[1] 0 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 2 1 0
注意:在这里,我创建了一个包含10列的小示例数据集。前5个为“数字”,其后为5个“字符”列。
set.seed(24)
mydata <- as.data.frame(matrix(sample(111:120, 5*20, replace=TRUE),
ncol=5))
set.seed(42)
mydata2 <- as.data.frame(matrix(sample(letters[1:10], 5*20,
replace=TRUE), ncol=5), stringsAsFactors=FALSE)
mydata <- cbind(mydata, mydata2)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句