合并两个数据帧时生成所有id时间对



我想基于列idtime将两个数据帧合并在一起。我认为一个例子更有效地展示了我想做的事情:

  • 这就是我所拥有的:
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

基本上,我希望为每个id生成time等于3的行,而不仅仅是具有一个等于3的周期的行。我希望解决方案尽可能短(最好基于dplyr函数,但代码的压缩性是第一位的(。

这个问题肯定已经被问过了,但我找不到解决办法。

有什么想法吗?

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

最新更新