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时"管道"或"链接"命令.这有助于您编写易于阅读的代码,因为它更自然,例如,您从左侧编写代码并从上到下编写代码,而不是从内到外深层嵌套(如示例代码中所示).
在你的问题的第一部分,你写道:
我知道我可以这样做:
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))
这是另一个选项(将多个函数应用于同一列):
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)