我的数据框df
包含a1,b1,a2,b2,a3,b3
列。另一方面,我有一个向量vec
。
我希望列df
中的元素位于b1,b2,b3
的时间vec
的每一行。
我的意思是,如果连续,列b1
和b2
的元素都在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
提前致谢!
答案 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