Соедините слева две таблицы в строках LHS, которые удовлетворяют условию, оставьте другие как NA - PullRequest
0 голосов
/ 21 сентября 2018

Рассмотрим следующий сценарий:

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 = Id1 только тогда, когда Type имеет определенное значение, например, Type == 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.

Как можно достичь такого соединения?

1 Ответ

0 голосов
/ 21 сентября 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...