首页 > 解决方案 > 检查每一行的数据框的条件,即逐行

问题描述

df我有一个带有列的数据框a1,b1,a2,b2,a3,b3。另一方面,我有一个向量vec

我想获取列中元素所在时间的每一df行。b1,b2,b3vec

我的意思是,如果在一行中,列的元素b1b2vec,但列的元素b3不在vec我想得到的2。如果列中的行的元素都不b1,b2,b3在其中vec(如果它们缺少值),我想得到0.

如果我放rowSums(!df[,c(b1,b2,b3)] %in% vec),我会得到错误'x' must be an array of at least two dimensions,因为里面的条件是一行,而不是 的行数df。我所做的其他尝试也失败了。

其中之一:只有 1 行的示例:

df[1,c('b1','b2','b3')]: 6 -1 NA

如果我把

df[1,c('b1','b2','b3')]==c(-1,-2),

我明白了

FALSE FALSE NA

我想去哪里

FALSE TRUE NA

提前致谢!

标签: rdataframetibble

解决方案


%in%a 上工作vector,所以我们遍历感兴趣的列并获得元素总和Reduce

Reduce("+", lapply(df[c('b1', 'b2', 'b3')], function(x) !x %in% vec))

如果我们按行进行比较,那么我们可以使用apply

rowSums(t(apply(df[c('b1', 'b2', 'b3')], 1, function(x) !x %in% vec)))

或将其转换为 a matrix,然后与 进行比较%in%,更改尺寸并执行rowSums

m1 <- as.matrix(df[c('b1', 'b2', 'b3')])
rowSums(`dim<-`(!m1 %in% vec, dim(m1)))

推荐阅读