以可读的方式获取不重复的dplyr计数


68

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

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

Answers:


135

这个选项怎么样:

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,然后通过计数柱的独特元素的数量总结aa通过的组bb

如您所见,我正在使用管道运算符%>%,在使用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

1
你好谢谢。您能解释%>%是什么意思吗?
GabyLP

1
@GabyP,我添加了一些解释。有关更多信息,请参阅dplyr简介
塔拉特2014年

17
什么%>%啊 只有关于dplyr的最好的事情。
gregmacfarlane
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.