簡體   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