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

Gab*_*yLP 51 idioms r summarization dplyr

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

data=data.frame(aa=c(1,2,3,4,NA), bb=c('a', 'b', 'a', 'c', 'c'))
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做:

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

但如果我想要独特元素的数量?

我可以:

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

  bb length(unique(unlist(aa)))
1  a                          2
2  b                          1
3  c                          2
Run Code Online (Sandbox Code Playgroud)

如果我想排除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
Run Code Online (Sandbox Code Playgroud)

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

tal*_*lat 107

这个选项怎么样:

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
Run Code Online (Sandbox Code Playgroud)

使用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))
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

  • 什么是'%>%`?只有关于dplyr的最好的事情. (13认同)