R在更改列名称时通过id和sub-id合并两个data.frame吗?

时间:2018-08-18 10:48:20

标签: r dataframe merge aggregate

我有两个这种格式的数据框。

df1:

id x y
1  2 3
2  4 5
3  6 7
4  8 9
5  1 1

df2:

id id2 v v2 
1  t  11 21
1  b  12 22
2  t  13 23
2  b  14 24
3  t  15 25 
3  b  16 26
4  b  17 27

因此,有时主'df'中的ID会出现两次(最大),有时出现一次,有时甚至根本不出现。预期结果将是:

df_merged:

id x y v.t v2.t v.b v2.b
1  2 3 11  21   12  22
2  4 5 13  23   24  24
3  6 7 15  25   16  26
4  8 9 NA  NA   17  27
5  1 1 NA  NA   NA  NA

我使用过merge,但是由于df2中的id2不匹配,我在df_merged中得到了两个id实例,如下所示:

id x y v v2
1  ... 
1  ... 

谢谢!

2 个答案:

答案 0 :(得分:1)

我们可以先将df2调整为正确的格式,然后进行正常的连接。

librar(dplyr)
library(tidyr)

df2 %>% gather(key,val,-id,-id2) %>%   #Transfer from wide to long format for v and v2
        mutate(new_key=paste0(key,'.',id2)) %>%  #Create a new id2 as new_key
        select(-id2,-key) %>%     #de-select the unnessary columns
        spread(new_key,val) %>%   #Transfer back to wide foramt with right foramt for id
        right_join(df1) %>%       #right join df1 "To includes all rows in df1" using id
        select(id,x,y,v.t,v2.t,v.b,v2.b) #rearrange columns name
Joining, by = "id"
  id x y v.t v2.t v.b v2.b
1  1 2 3  11   21  12   22
2  2 4 5  13   23  14   24
3  3 6 7  15   25  16   26
4  4 8 9  NA   NA  17   27
5  5 1 1  NA   NA  NA   NA

答案 1 :(得分:0)

您可以仅使用merge来解决此问题。根据{{​​1}}等于df2还是id2拆分b。将这两个新对象与t合并,最后将它们合并在一起。该代码包括另外一个步骤,该步骤还包括在df1中找到的数据,但不包括在df1中找到的数据。

df2