比较df并根据匹配的行填充col

时间:2020-10-12 16:24:50

标签: r dplyr

我有两个看起来像这样的df,

id1<-c(2,2,2,1,3)
id2<-c(4,4,5,2,3)
OS<-c(1,2,3,4,5)
a <- cbind(OS, id1, id2) 
a
i1<-c(2,2,2,4,3)
i2<-c(4,4,5,2,3)
OSi<-c(1,2,3,4,5)
b <- cbind(OSi, i1, i2) 

我想创建一个新的带有(0)的col(x),其中a $ OS和a $ OSi匹配(即1-> 1,2-> 2),但是仅在每个df中随后的两个col是并同意,否则为“ 1”。 我想要的输出是这样的:

id1<-c(2,2,2,1,3)
id2<-c(4,4,5,2,3)
OS<-c(1,2,3,4,5)
x <-c(0,0,0,1,0)
a <- cbind(OS, id1, id2, x) 
a

到目前为止,我已经尝试过:

a$x <- case_when(a$OS %in% b$OSi &
                     a$id1 %in% b$I1 & 
                     b$id2 %in% b$I2 ~ '0') %>%
  replace_na('1')

但是,我发现Case_when只满足这里的第一个参数。 (即0/1的比率根据变量的顺序而变化)。

此外,以上内容是最高的df。我的实际数据是〜10000行,b比a长。我可能还想删除不在a中而是在b中的任何行。

我希望这很清楚。 Dplyr我更喜欢集成到管道中!

干杯!

1 个答案:

答案 0 :(得分:1)

这项工作:

> id1<-c(2,2,2,1,3)
> id2<-c(4,4,5,2,3)
> OS<-c(1,2,3,4,5)
> a <- data.frame(OS, id1, id2) 
> 
> 
> i1<-c(2,2,2,4,3)
> i2<-c(4,4,5,2,3)
> OSi<-c(1,2,3,4,5)
> b <- data.frame(OSi, i1, i2) 
> 
> 
> transform(a %>% inner_join(b, by = c('OS' = 'OSi')), x = ifelse((id1 == i1) & (id2 == i2), 0, 1)) %>% select(OS, id1, id2, x)
  OS id1 id2 x
1  1   2   4 0
2  2   2   4 0
3  3   2   5 0
4  4   1   2 1
5  5   3   3 0
> 

我使用了inner_join,所以我们根据您的第一个条件a $ OS == b $ OSi

加入
相关问题