我想基于列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
基本上,我希望为每个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