-
summarize()
将一列数据折叠成一行,经常与group_by() 组合构成了使用dplyr 包时最常用的操作之一:分组摘要。如果没有group_by,就会把整个数据框作为一个整体,会变成一行。
by_day <- group_by(flights, year, month, day)
summarise(by_day, delay = mean(dep_delay, na.rm = TRUE))
计算每天平均延误时间
1. 管道操作 (可以简化代码,不用重复定义并输入数据框名)
例如,x %>% f(y) 会转换为f(x, y),x %>% f(y) %>% g(z) 会转换为g(f(x,y), z)。也就是说%>%符号前面的那个数据框名,后面不用重复写了。
#level一-生成中间产物,不喜欢
by_day <- group_by(flights, year, month, day)
summarise(by_day, delay = mean(dep_delay, na.rm = TRUE))
#level二-这个是我习惯的方式
summarise(group_by(flights, year, month, day), delay = mean(dep_delay, na.rm = TRUE))
#level三-管道操作连接两步,数据框名在括号里面
group_by(flights, year, month, day) %>% summarise(delay = mean(dep_delay, na.rm = TRUE))
#level四-管道操作连接两步,数据框名在括号里面
flights %>%group_by( year, month, day) %>% summarise(delay = mean(dep_delay, na.rm = TRUE))
摘自生信星球-小洁
注:管道操作连接多行命令时,将管道符号%>%放在上一行末尾。
2. 缺失值 (na.rm = TRUE这个参数会在计算前移除缺失值)
如果不加这个参加,mean()计算出来的只有其中一个是NA,结果就是NA。
3. 计数
carriers <- group_by(flights, carrier)
s1 <- summarise(carriers, n())
s2 <- count(flights,carrier)
mu <- mutate(carriers, n = n())
s3 <- distinct(mu,n)
s4 <- distinct(mu,carrier,n)
四种方法统计的结果是一致的
摘自生信星球
注意n()和count()的用法。distinct是去重复。
如果想要计算出非缺失值的数量,可以使用sum(!is.na(x))。要想计算出唯一值的数量,可以使用n_distinct(x).
注意n()和sum()用法相同,在括号里面辅助条件。count是在括号外面,自己计数。
s2 <- count(flights,carrier)
s1 <- summarise(carriers, n())
s1 <- summarise(mu, sum(n<100)) 不符合条件的返回0,符合条件的返回当下数值。
逻辑值的计数和比例:sum(x > 10) 和mean(y == 0)当与数值型函数一同使用时,TRUE 会转换为1,FALSE 会转换为0。这使得sum() 和mean()非常适用于逻辑值:sum(x) 可以找出x 中TRUE 的数量,mean(x) 则可以找出比例。
4.常用摘要函数-摘自生信星球小洁
5. 分组
先按照年月日分组,也就是按天daily <- group_by(flights, year, month, day)
(per_day <- summarise(daily, flights = n()))#再按照月份汇总摘要
(per_month <- summarise(per_day, flights = sum(flights)))
再按年汇总,只有一年的数据所以成了一行
(per_year <- summarise(per_month, flights = sum(flights)))
sum()为什么就是合并月份?
6.取消分组
如果想要取消分组,并回到未分组的数据继续操作,那么可以使用ungroup() 函数
daily %>%
ungroup() %>% # 不再按日期分组
summarize(flights = n()) # 所有航班