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

时间:2015-08-28 11:47:03

标签: r

我想计算数据帧每行中满足多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"))

1 个答案:

答案 0 :(得分:3)

%in%运算符不适用于data.frame。我们可以使用lapply/sapply/vapply遍历列并执行%in%。在我们获得list中的逻辑索引之后,我们使用+得到元素和(Reduce)。即使有NA%in%个值,match使用带有参数nomatch=0L的{​​{1}},而==返回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 s(lapply(mydata[1:5], ...)lapply(mydata[6:10], ...))作为Map的输入。 &会比较相应的list元素,如果TRUETRUE都返回FALSE,则会返回listReduce从那里,我们可以使用前面所述的 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 代码将是

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)

注意:这里我创建了一个10列的小示例数据集。前5个是'数字',后跟5'字符'列。

数据

var myString = "Hello Alex, I am John";
matches = myString.match(/"Hello (.+) I am (.+)/);
console.log(match[1]);
console.log(match[2]);