我是使用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
但对我来说,有点难以理解。有没有更好的方法来进行这种摘要?
答案 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))