以可读的方式获得不同的dplyr计数

时间:2014-11-03 18:12:49

标签: r dplyr idioms summarization

我是使用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

如果我想排除NAs,我会这样做:

> 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

但对我来说,有点难以理解。有没有更好的方法来进行这种摘要?

1 个答案:

答案 0 :(得分:96)

这个选项怎么样:

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具有NAs的所有行,然后按列bb对数据进行分组,然后通过计算列{{1}的唯一元素数量进行汇总} aa组。

正如您所看到的,我正在使用管道操作员bb,您可以使用它来管道&#34;管道&#34;或&#34;链&#34;使用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))