繁体   English   中英

左连接满足条件的LHS行上的两个表,其他保持为NA

[英]Left join two tables on LHS rows that meet a condition, leave others as 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

我只想在Type具有某个值(例如Type == 1时通过Id2 = Id1对其自身进行test ,这样我才能得到以下结果:

#>   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表示层次结构,因此这种类型的联接将使我可以“扩展”层次结构,以使每一行最终以不等于Id1任何值的Id2终止。

一个人如何实现这样的联接?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM