我想计算数据帧每行中满足多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"))
答案 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
元素,如果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
代码将是
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]);