检查每行的数据框条件,即逐行

时间:2018-05-18 11:40:22

标签: r dataframe tibble

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

我希望列df中的元素位于b1,b2,b3的时间vec的每一行。

我的意思是,如果连续,列b1b2的元素都在vec中,但列b3的元素不在{ {1}}我想获得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

如果我把

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

我得到了

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

我想去哪里

FALSE FALSE NA

提前致谢!

2 个答案:

答案 0 :(得分:1)

%in%适用于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)))

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

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

答案 1 :(得分:0)

当前,解决方案可能是:

df %>% mutate(new = rowSums(across(matches("^b\\d$"), ~`%in%`(.,vec))))

以示例

library(tidyverse)
vec <- c(7, 8)
df <- anscombe %>% 
          mutate(across(starts_with("y"),floor))
df
   x1 x2 x3 x4 y1 y2 y3 y4
1  10 10 10  8  8  9  7  6
2   8  8  8  8  6  8  6  5
3  13 13 13  8  7  8 12  7
4   9  9  9  8  8  8  7  8
5  11 11 11  8  8  9  7  8
6  14 14 14  8  9  8  8  7
7   6  6  6  8  7  6  6  5
8   4  4  4 19  4  3  5 12
9  12 12 12  8 10  9  8  5
10  7  7  7  8  4  7  6  7
11  5  5  5  8  5  4  5  6

一个人可以做:

df %>% 
    mutate(new = rowSums(across(starts_with("y"), ~`%in%`(.,vec))))
   x1 x2 x3 x4 y1 y2 y3 y4 new
1  10 10 10  8  8  9  7  6   2
2   8  8  8  8  6  8  6  5   1
3  13 13 13  8  7  8 12  7   3
4   9  9  9  8  8  8  7  8   4
5  11 11 11  8  8  9  7  8   3
6  14 14 14  8  9  8  8  7   3
7   6  6  6  8  7  6  6  5   1
8   4  4  4 19  4  3  5 12   0
9  12 12 12  8 10  9  8  5   1
10  7  7  7  8  4  7  6  7   2
11  5  5  5  8  5  4  5  6   0