R 与df比较并基于匹配行填充col
我有两个像这样的dfR 与df比较并基于匹配行填充col,r,dplyr,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 我想创建一个新的x列,其中一个$OS和一个$OSi匹配,即1->1,2->2,但只有在每个df中的后续两个col一致的情况下,才使用“0”,而在不一致的情况下使用“1”。 我想要的输出是这样的: id1<-c(2,2,2,1,3) id2<-c(4,4,5,2,3) OS<
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
我想创建一个新的x列,其中一个$OS和一个$OSi匹配,即1->1,2->2,但只有在每个df中的后续两个col一致的情况下,才使用“0”,而在不一致的情况下使用“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')
然而,我发现当只满足第一个参数时,情况是这样的。i、 e.0/1的比率根据变量的顺序而变化
此外,上面是一个顶部df。我的实际数据约为10000行,b比a长。我可能还想删除不是a中的任何行,而是b中的任何行
我希望这足够清楚。
Dplyr我喜欢集成到管道中
干杯 这是否有效:
> 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
>
我使用了internal_join,因此我们是基于您的第一个条件a$OS==b$OSi进行连接的我认为我无法绑定df,因为它们的长度不同:data.frame中有错误…,check.names=FALSE:参数意味着不同的行数:76258996 OK,根据示例数据假设是这样。那么,操作系统和OSi重叠吗?在这种情况下,它们可以用作主键和外键吗?如果是这样的话,哪一个是你的主表,我假设它是一个?已经更改了代码,你能检查一下它是否有效吗?嗨,Karthik,谢谢你,但是它不太有效。我不知道为什么,但它给我的积极1结果比我预期的要少。好的,你能在上面的样本数据中包括你没有得到预期输出的部分吗?样本数据中只有5行,可能很难将问题可视化。
> 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
>