gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:57:44 25 4
gpt4 key购买 nike

我想计算数据框每一行中满足多个 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%。在我们获得 list 中的逻辑索引后,我们使用 Reduce 获得元素总和 (+)。即使存在 NA 值,这也会起作用,因为 %in% 使用带有参数 nomatch=0Lmatch==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

对于第二部分的问题,我们可以用Map构造&,然后用Reduce得到+

我们使用两个逻辑 list (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)

关于r - 计算满足多个 OR 语句和 AND 语句的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32270345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com