合并数据框中的重复行

时间:2017-06-28 17:42:06

标签: r dataframe aggregate

这是我提出的过去问题的延续。基本上,我有一个数据框df

         Beginning1 Protein2    Protein3    Protein4    Biomarker1
Pathway3    A         G           NA           NA           F
Pathway6    A         G           NA           NA           E
Pathway2    A         B           H            NA           F
Pathway5    A         B           H            NA           E
Pathway1    A         D           K            NA           F
Pathway7    A         B           C            D            F
Pathway4    A         B           C            D            E

现在我想整合行看起来像这样:

dfnew 
         Beginning1 Protein2    Protein3    Protein4    Biomarker1
Pathway3    A         G           NA           NA           F, E
Pathway2    A         B           H            NA           F, E
Pathway7    A         D           K            NA           F    
Pathway1    A         B           C            D            F, E

我已经看到很多人使用聚合在数据框架中合并相同的行,但我似乎无法使用该函数来处理非数值。我见过的最接近的问题是这样解决的:df1 <- aggregate(df[7], df[-7], unique),可以在这里找到:Combining duplicated rows in R and adding new column containing IDs of duplicates

此外,并非每条途径都有匹配对,如路径1所示。

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

使用软件包的以下解决方案应该做你想做的事情:

df %>%
    group_by(Protein2, Protein3, Protein4) %>%
    nest() %>%
    mutate(Biomarker1 = lapply(data, `[[`, 'Biomarker1'),
           Biomarker1 = unlist(lapply(Biomarker1, paste, collapse = ', '))) %>%
    ungroup() %>%
    # Restore the “Beginning1” column is a bit of work, unfortunately.
    mutate(Beginning1 = lapply(data, `[[`, 'Beginning1'),
           Beginning1 = unlist(lapply(Beginning1, `[[`, 1))) %>%
    select(-data)

答案 1 :(得分:0)

这是一个应该产生预期结果的dplyr解决方案。

library(dplyr)

df <- df %>%
      group_by(Beginning1, Protein2, Protein3, Protein4) %>%
      summarise(Biomarker1 = paste(Biomarker1, collapse = ", "))