【问题标题】:combine duplicates and keep unique elements using dplyr::distinct使用 dplyr::distinct 组合重复项并保留唯一元素
【发布时间】:2016-07-25 01:58:39
【问题描述】:

我想合并行,删除重复,但保留唯一性。我可以做前两个,但不能做第二个。我有一个名为 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

谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以通过粘贴(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 方式,我们可以从summarise_each 中删除unique

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

    【讨论】:

    • 谢谢你,@akrun!您的第一个选项非常有效。一个简单的问题:我用空白单元格试了一下,发现我得到了一些逗号。任何想法如何添加代码以避免计算空白单元格?请参见上面的新示例。谢谢!!!
    • @richiepop2 一种选择是将其转换为 NA 并使用 is.na 将其删除,否则,我们可以使用 summarise_each(funs(toString(.[nzchar(.)])))
    • 我尝试了您提供的解决方案,但似乎没有用。我正在努力弄清楚如何组合行,但跳过空白。请参阅上面的新代码示例。
    • @richiepop2 我确实对此进行了测试,并且使用 dplyr_0.5.0 对我有用。你确定它们是空格,即"",还是你知道它们是否是空格" "
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多