【问题标题】:Compare to df's and populate col based on matching rows与 pdf 比较并根据匹配行填充列
【发布时间】:2020-10-12 16:24:50
【问题描述】:

我有两个像这样的 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 中的后续两个 cols 是同意,而他们不同意的地方是“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 我更喜欢集成到管道中!

干杯!

【问题讨论】:

    标签: r dplyr


    【解决方案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 加入

    【讨论】:

    • 我不认为我可以绑定 df,因为它们的长度不同:data.frame 中的错误(...,check.names = FALSE):参数意味着不同的行数:7625 , 8996
    • 好的,从您的示例数据中假设是这样。那么,OS 和 OSi 是否重叠?在这种情况下它们可以用作主键和外键吗?如果是这样,那是您的主表,我假设它是“a”?
    • 已更改代码,请检查是否有效?
    • 嗨,Karthik,谢谢你,但它不太好用。我不知道为什么,但它给我的积极 (1) 结果比我预期的要少。
    • 好的,您能否将未获得预期输出的部分包含在上面的示例数据中?示例数据中只有 5 行,可能很难将问题可视化。
    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2019-12-09
    • 2023-01-12
    相关资源
    最近更新 更多