首页 > 解决方案 > 左连接满足条件的 LHS 行上的两个表,将其他表保留为 NA

问题描述

考虑以下场景:

test <- data.frame(Id1  = c(1, 2, 3, 4, 5, 10, 11), 
                   Id2  = c(3, 4, 10, 11, 12, 15, 9), 
                   Type = c(1, 1, 1, 2, 2, 2, 1) )
test
#>   Id1 Id2 Type
#> 1   1   3    1
#> 2   2   4    1
#> 3   3  10    1
#> 4   4  11    2
#> 5   5  12    2
#> 6  10  15    2
#> 7  11   9    1

我想仅在具有特定值时才加入test自身,例如以这样的方式获得以下结果:Id2 = Id1TypeType == 1

#>   Id1 Id2 Type.x Id2.y Type.y
#> 1   1   3    1      10      1   # matches row 3
#> 2   2   4    1      11      2   # matches row 4
#> 3   3  10    1      15      2   # matches row 6
#> 4   4  11    2      NA     NA   # matches row 7 but Type != 1
#> 5   5  12    2      NA     NA   # Type !=1
#> 6   10 15    2      NA     NA   # Type !=1
#> 7   11  9    1      NA     NA   # Type == 1 but no matches

由于在这种情况下,test表示层次结构,因此这种类型的连接将允许我“扩展”层次结构,以便每一行最终以Id2不等于任何值的Id1.

怎样才能实现这样的加入?

标签: r

解决方案


Tidyverse 是一个很棒的数据操作包。在这里,我们可以这样做:

library(tidyverse)
joined <- test %>% left_join(test %>% filter(Type==1), by = c("Id1" = "Id2"))
joined

更新:

library(tidyverse)
joined <- test %>%
  filter(Type==1) %>% left_join(test, by = c("Id2" = "Id1")) %>%
  bind_rows(test %>% filter(Type==2) %>% rename(Type.x = Type))
joined


Id1 Id2 Type.x Id2.y Type.y
1   3   1   10  1
2   4   1   11  2
3   10  1   15  2
11  9   1   NA  NA
4   11  2   NA  NA
5   12  2   NA  NA
10  15  2   NA  NA

推荐阅读