Генерировать все пары id-time при объединении двух фреймов данных - PullRequest
1 голос
/ 24 февраля 2020

Я хотел бы объединить два кадра данных на основе столбцов id и time. Я думаю, что пример более эффективен, чтобы показать, что я хочу сделать:

  • это то, что у меня есть:
library(dplyr)

df1 <- tibble(id = c("a", "a", "b", "b", "c", "c"),
              time = c(1, 2, 1, 2, 1, 2),
              val1 = c(2000:2005))

  id     time  val1
  <chr> <dbl> <int>
1 a         1  2000
2 a         2  2001
3 b         1  2002
4 b         2  2003
5 c         1  2004
6 c         2  2005

df2 <- tibble(id = c("a", "a", "b", "b", "c", "c"),
              time = c(1, 2, 1, 2, 2, 3),
              val2 = c(2000:2005))

  id     time  val2
  <chr> <dbl> <int>
1 a         1  2000
2 a         2  2001
3 b         1  2002
4 b         2  2003
5 c         2  2004
6 c         3  2005
  • это желаемый результат :
  id     time  val1  val2
  <chr> <dbl> <dbl> <dbl>
1 a         1  2000  2000
2 a         2  2001  2001
3 a         3    NA    NA
4 b         1  2002  2002
5 b         2  2003  2003
6 b         3    NA    NA
7 c         1  2004    NA
8 c         2  2005  2004
9 c         3    NA  2005

По сути, я хочу генерировать строки с time, равным 3 для каждого id, а не только с одним периодом, равным 3. Я хотел бы получить решение быть настолько коротким, насколько это возможно (и желательно на основе dplyr функций, но прежде всего нужно скомпилировать код).

Конечно, этот вопрос уже задавался, но я не могу найти решение.

Есть идеи?

1 Ответ

2 голосов
/ 24 февраля 2020

После full_join мы можем использовать complete

library(dplyr)
library(tidyr)
full_join(df1, df2,, by = c('id', 'time')) %>% 
       complete(id, time)
# A tibble: 9 x 4
#  id     time  val1  val2
#  <chr> <dbl> <int> <int>
#1 a         1  2000  2000
#2 a         2  2001  2001
#3 a         3    NA    NA
#4 b         1  2002  2002
#5 b         2  2003  2003
#6 b         3    NA    NA
#7 c         1  2004    NA
#8 c         2  2005  2004
#9 c         3    NA  2005
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...