【问题标题】:Get dplyr count of distinct in a readable way以可读的方式获取不同的 dplyr 计数
【发布时间】:2014-12-30 11:16:28
【问题描述】:

我是使用 dplyr 的新手, 我需要计算组中的不同值。这是一个表格示例:

data=data.frame(aa=c(1,2,3,4,NA), bb=c('a', 'b', 'a', 'c', 'c'))

我知道我可以做以下事情:

by_bb<-group_by(data, bb, add = TRUE)
summarise(by_bb, mean(aa, na.rm=TRUE), max(aa), sum(!is.na(aa)), length(aa))

但是如果我想要唯一元素的数量呢?

我能做到:

  > summarise(by_bb,length(unique(unlist(aa))))

  bb length(unique(unlist(aa)))
1  a                          2
2  b                          1
3  c                          2

如果我想排除 NA,我可以这样做:

> summarise(by_bb,length(unique(unlist(aa[!is.na(aa)]))))

  bb length(unique(unlist(aa[!is.na(aa)])))
1  a                                      2
2  b                                      1
3  c                                      1

但它对我来说有点难以理解。有没有更好的方法来做这种总结?

【问题讨论】:

    标签: r dplyr idioms summarization


    【解决方案1】:

    这个选项怎么样:

    data %>%                    # take the data.frame "data"
      filter(!is.na(aa)) %>%    # Using "data", filter out all rows with NAs in aa 
      group_by(bb) %>%          # Then, with the filtered data, group it by "bb"
      summarise(Unique_Elements = n_distinct(aa))   # Now summarise with unique elements per group
    
    #Source: local data frame [3 x 2]
    #
    #  bb Unique_Elements
    #1  a               2
    #2  b               1
    #3  c               1
    

    使用filter 过滤掉aa 具有NA 的任何行,然后按bb 列对数据进行分组,然后按bb 组对aa 列的唯一元素数进行汇总。

    如您所见,我正在使用管道运算符%&gt;%,您可以在使用 dplyr 时将其“管道”或“链接”命令。这有助于您编写易于阅读的代码,因为它更自然,例如您从左到右编写代码,从上到下编写代码,而不是从内到外深度嵌套(如您的示例代码)。

    编辑:

    在你问题的第一部分,你写道:

    我知道我可以做以下事情:

    by_bb<-group_by(data, bb, add = TRUE)
    summarise(by_bb, mean(aa, na.rm=TRUE), max(aa), sum(!is.na(aa)), length(aa))
    

    这是另一种选择(将多个函数应用于同一列):

    data %>%
      filter(!is.na(aa)) %>%
      group_by(bb) %>%
      summarise_each(funs(mean, max, sum, n_distinct), aa)
    
    #Source: local data frame [3 x 5]
    #
    #  bb mean max sum n_distinct
    #1  a    2   3   4          2
    #2  b    2   2   2          1
    #3  c    4   4   4          1
    

    【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2018-10-23
    • 1970-01-01
    • 2012-05-03
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多