group_by 之后连接表

Sam*_*mos 2 r left-join dplyr

我想在 group_by 操作后对两个表执行联接。

A <- data.frame(x1=c("a","b","c","d"))
B <- data.frame(x1=c("a","c","d","c","a"), x2=c(1,1,1,2,2))
Run Code Online (Sandbox Code Playgroud)

这个想法是 x2 是一个 ID,x1 可能是一个日期之类的东西,并且可能还有其他温度值列。表A包含所有日期并B包含实际观察结果。当没有观察时,我希望最终得到一个包含 NA 的所有 ID 的所有日期的表格。以下命令生成:

> dplyr::left_join(A,B,by="x1")
  x1 x2
1  a  1
2  a  2
3  b NA
4  c  1
5  c  2
6  d  1
Run Code Online (Sandbox Code Playgroud)

但我想要的东西更像是:

x1 x2
a  1
a  2
b NA
b NA
c  1
c  2
d  1
d NA
Run Code Online (Sandbox Code Playgroud)

所以我尝试了这个但没有成功:

B %>% dplyr::group_by(x2) %>% dplyr::left_join(A,.data,by="x1")
Run Code Online (Sandbox Code Playgroud)

如果可能的话,保留group_by(x2)对我来说真的很有用

sha*_*dow 5

一种方法是添加一个变量来计算 的观测值数量x1,然后使用 来完成 data.frame tidyr::complete

require(dplyr)

left_join(A, B, by="x1")  %>% 
  # add variable "obs"
  group_by(x1) %>%
  mutate(obs = seq(n())) %>%
  ungroup %>%
  # complete the data
  tidyr::complete(x1, obs) %>%
  select(-obs)
Run Code Online (Sandbox Code Playgroud)

来源:本地数据框 [8 x 2]

##      x1    x2
##   (chr) (dbl)
## 1     a     1
## 2     a     2
## 3     b    NA
## 4     b    NA
## 5     c     1
## 6     c     2
## 7     d     1
## 8     d    NA
Run Code Online (Sandbox Code Playgroud)