使用dplyr :: distinct组合重复项并保留唯一元素

时间:2016-07-24 03:59:21

标签: r dplyr

我希望合并行,删除重复内容,但保持唯一身份。我可以做前两个,但不是第二个。我有一个名为subject的df,看起来像这样:

unique_id   subject     grade
1            Math         88
1            English      78
1            History      98
2            Math         65
2            English      72
2            History      84

此代码

combined <- distinct(subject, unique_id, .keep_all = TRUE)

给了我这个输出:

   unique_id    subject     grade
1               Math          88
2               Math          65

我希望看起来像这样:

   unique_id    subject                       grade
1               Math, English, History        88, 78, 98
2               Math, English, History        65, 72, 84

以下解决方案完美无缺!这是问题的另一个问题。

如果我有一个如下所示的数据集:

unique_id   school  subject  grade  sex
    1       great   Math      88    
    1       great   English   78    
    1       great   History   98    male
    2       spring  Math      65    
    2       spring  English   72    female
    2       spring  History   84    

并运行以下代码:

(r2 <- df %>%
  group_by(unique_id) %>% 
  summarise_each(funs(toString(unique(.)))))

我得到以下输出:

unique_id   school  subject                     grade       sex
    1       great   Math, English, History      88,78,98     , male 
    2       spring  English, English, History   65,72,84     , female

有没有办法让它将空单元格与性别类别中的逗号组合在一起,所以它看起来像这样:

unique_id   school  subject                     grade       sex
    1       great   Math, English, History      88,78,98     male   
    2       spring  English, English, History   65,72,84     female

谢谢!

1 个答案:

答案 0 :(得分:2)

我们可以通过粘贴(toStringpaste(., collapse=", ")的包装器)来完成此操作。在按“unique_id”分组后,每列的唯一元素一起

library(dplyr)
(r1 <- df %>%
        group_by(unique_id) %>% 
        summarise_each(funs(toString(unique(.)))))
#   unique_id                subject      grade
#       <int>                  <chr>      <chr>
#1         1 Math, English, History 88, 78, 98
#2         2 Math, English, History 65, 72, 84

或者我们可以将其保留为list,然后提取list元素

r2 <- df %>% 
       group_by(unique_id) %>% 
       summarise_each(funs(list(unique(.))))

从“r2”开始,如果需要,我们可以unnest(来自tidyr

library(tidyr)
r2 %>%
  unnest()

如果我们在distinct中使用OP方式,我们可以从unique中移除summarise_each

df %>%
   distinct(subject, unique_id, .keep_all=TRUE) %>%
   group_by(unique_id) %>%
   summarise_each(funs(toString(.)))