计算满足多个OR语句和AND语句的列

阿斯塔特

我想计算数据框每一行中满足多重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,同时==返回NANA值。

 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来获取+

我们使用两个逻辑lists(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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章