【问题标题】:R merge two data.frame by id and sub-id while changing column names?R在更改列名时通过id和子id合并两个data.frame?
【发布时间】:2019-01-25 05:26:54
【问题描述】:

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

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

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

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

提前致谢!

【问题讨论】:

    标签: r dataframe merge aggregate


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      您只需使用merge 即可解决此问题。根据 id2 是否等于 bt 拆分 df2。将这两个新对象与df1 合并,最后合并在一起。该代码包括一个额外的步骤,还包括在df1 中找到的数据,而不是在df2 中找到的数据。

      dfb <- merge(df1, df2[df2$id2=='b',], by='id')
      dft <- merge(df1, df2[df2$id2=='t',], by='id')
      dfRest <- df1[!df1$id %in% df2$id,]
      dfAll <- merge(dfb[,c('id','x','y','v','v2')], dft[,c('id','v','v2')], by='id', all.x=T)
      merge(dfAll, dfRest, all.x=T, all.y=T)
      
        id x y v.x v2.x v.y v2.y
      1  1 2 3  12   22  11   21
      2  2 4 5  14   24  13   23
      3  3 6 7  16   26  15   25
      4  4 8 9  17   27  NA   NA
      5  5 1 1  NA   NA  NA   NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 2018-09-20
        • 2022-11-18
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        • 2017-09-10
        相关资源
        最近更新 更多