按组和公共ID合并数据(在组外重复的ID)

时间:2016-10-17 17:31:21

标签: r dplyr

这是How to join (merge) data frames的重复问题。您可以在组内执行left.merge,但不能在整个数据集中执行。 ID是唯一的内部组,不是 acroos组。 不分组并使用left.merge,您将搞乱数据

我有许多组的数据(面板数据/时间系列)。 组中,我想通过公共ID合并数据。并在我拥有的所有群组中应用相同的合并(对于所有其他群组,merge相同)。

#sample data
a<-data.frame(c(1:4,1:4),1,c('a','a','a','a','b','b','b','b'))
b<-data.frame(c(2,4,2,4),10,c('a','a','b','b'))

colnames(a)<-c('id','v','group')
colnames(b)<-c('id','v1','group')

> a
  id v group
1  1 1     a
2  2 1     a
3  3 1     a
4  4 1     a
5  1 1     b
6  2 1     b
7  3 1     b
8  4 1     b
> b
  id v1 group
1  2 10     a
2  4 10     a
3  2 10     b
4  4 10     b

我尝试使用dplyr group_by (group)然后使用merge(a,b,by='id',all.x=TRUE),但不确定如何将dplyr应用于两个数据集

所需的输出(左合并)

  id v group.x v1 group.y
  1  1       a NA    <NA>
  2  1       a 10       a
  3  1       a NA    <NA>
  4  1       a 10       a
  1  1       b NA    <NA>
  2  1       b 10       b
  3  1       b NA    <NA>
  4  1       b 10       b

1 个答案:

答案 0 :(得分:2)

您只需在group参数中包含by即可:

a %>% left_join(b, by=c("id","group"))
  id v group v1
1  1 1     a NA
2  2 1     a 10
3  3 1     a NA
4  4 1     a 10
5  1 1     b NA
6  2 1     b 10
7  3 1     b NA
8  4 1     b 10

这只给你一个&#34;组&#34;对于v1中没有匹配行的情况,NAb,因此创建两个单独的&#34;组&#34};列是多余的。鉴于该组(可能)代表两个数据框中数据的相同底层划分,那么这样会更好吗?