1.4 summarize() | R for data science: tidyverse and beyond
文章推薦指數: 80 %
位置度量我们已经使用过 mean(x) 、但用 median(x) 计算中位数也非常有用。
## 将聚合函数和逻辑筛选组合起来使用 not_cancelled %>% group_by(year ...
R4DS:tidyverseandbeyond
前言
IRfordatascience
1dplyr:Datatransformation
1.1filter()
1.1.1Operators
1.1.2Missingvalues
1.1.3Exercises
1.1.4slice()
1.2arrange()
1.2.1Exercises
1.3select()
1.3.1练习
1.3.2常用创建函数
1.3.3Exercises
1.4summarize()
1.4.1Missingvaluesinsummarize()
1.4.2计数函数
1.4.3逻辑值的计数和比例:sum(x>10)和mean(y==0)
1.4.4其他常用的摘要函数
1.4.5多个分组变量的消耗
1.5group_by()combinedwithotherfunctions
1.6Exercises
2tibble:Moderndataframes
2.1Introduction
2.2Comparingtibbleanddata.frame
2.2.1Creating
2.2.2Printing
2.2.3Subsetting
2.3Comparingtwodataframes(tibbles)
2.3.1dplyr::all_equal()
2.3.2janitor::compare_df_cols()
2.3.3vetr::alike()
2.3.4diffdf::diffdf()
2.4Exercises
3readr:Dataimport
3.1ImportingdatainbaseR
3.2Importingdatainreadr
3.2.1Introduction
3.2.2Writingdata
3.2.3Exercises
3.3Parsingavector
3.3.1Numeric
3.3.2Character
3.3.3Factor
3.3.4Dateandtime
3.3.5Exercises
3.4Parsingafile
3.4.1Strategies
3.4.2Possiblechallenges
3.4.3Othertips
3.4.4Example:Dealingwithmetadata
3.4.5Example:multi-rowheaders
3.5readxl
3.5.1Multi-rowheadersinExcel
4lubridate:Datesandtimes
4.1Creatingdatesandtimes
4.1.1Fromstrings
4.1.2Fromindividualcomponents
4.1.3Fromothertimes
4.1.4Exercises
4.2Date-timecomponents
4.2.1Accessingcomponents
4.2.2Rounding
4.2.3Settingcomponents
4.2.4Exercises
4.3Timespan
4.3.1时期Durations
4.3.2阶段Periods
4.3.3区间Intervals
4.3.4Conclusion
4.3.5Exercises
4.4hms
4.5dint
4.5.1Creation
4.5.2ArithmeticandSequences
4.5.3Accessors
4.5.4Formatting
4.5.5Labellingfunctionsinggplot2
5forcats:factor
5.1Factorbasics
5.2Sorting
5.2.1Sortingbyfrequency,appearance,ornumericorder
5.2.2Sortingbyanothervariable
5.2.3Sortingmanually
5.3Chaningenumberoflevels
5.3.1Lumpinglevels
5.3.2Expandinglevels
5.3.3Droppinglevels
5.3.4TransformingNAlevels
5.4Recoding
5.4.1Exercises
6tidyr:Tidydata
6.1Tidydata
6.1.1Exercises
6.2Pivoting
6.2.1pivot_longer()
6.2.2pivot_wider()
6.2.3Combiningpivot_longer()andpivot_wider()
6.2.4Exercises
6.3Nesting
6.3.1Example:Managingmultiplemodels
6.3.2Example:Multicplehoicedata
6.4Rectangling
6.4.1Githubusers
6.4.2Githubrepos
6.4.3GameofThronecharacters
6.4.4SharlaGelfand’sdiscography
6.5separate()anduntie()
6.5.1separate()
6.5.2unite()
6.5.3Exercises
6.6Handlingmissingvalues
6.7CaseStudy
6.8MiscellaneousFunctions
6.8.1chop()andunchop()
6.8.2uncount()
6.8.3Exercises
6.9None-tidydata
7purrr:Functionalprogramming
7.1map()family
7.2Producingatomicvectors
7.2.1purrr-styleanonymousfunctions
7.3Predicatefunctions
7.3.1Basics
7.3.2Mapvariants
7.4groupfunctions
7.4.1group_map、group_modify
7.4.2group_nest、group_split、group_keys、group_data
7.5Otherusefultools
7.5.1imap()
7.5.2adverbs
8Relationaldata
8.1Introduction
8.2Mutatingjoins
8.3Filteringjoin
9broom:Tidyrepresentationofmodels
9.1Visualizingmanymodels
9.2Examples
9.2.1PCA
9.3broomExtra
9.4ggfortify
IIImporting
10vroom:Fastreadingofdelimitedfiles
11Readingindatafromotherformats
11.1PDF
11.1.1Scrapingpdfdata
11.2Officedocuments
11.3Googlesheet
11.4Images
12UsefulAPIs
12.1WDI
12.1.1WDIsearch()
12.1.2WDI
12.2ipumsr
IIIExploringandWrangling
13Datasummary
13.1skimr
13.2visdat
13.3summarytools
13.3.1freq
13.3.2descr()
13.4gtandgtsummary
13.5naniar
14Janitor
14.1cleaning
14.1.1clean_names
14.2Exploring
14.2.1tabyl
14.2.2get_dupes
14.2.3remove_
14.2.4round_half_up
14.2.5excel_numeric_to_date
14.2.6top_levels
14.2.7row_to_names
IVMiscellaneoustools
15Advancedrelationaldata
15.1fuzzyjoin
15.1.1inexactmatching
15.1.2stringdist
15.2funneljoin
15.2.1after_join()
15.2.2funnelinonetable
15.3dm
16Categoricaldata(facotr)
16.1Frequencyandcontingencytable
16.1.1frq()andflat_table()
16.2Coding
16.2.1rec()
16.3Cutting
16.3.1chop()
17Dealingwithmissingvalues
17.1Exploring
17.1.1naniar
17.1.2ReplaceavaluewithNA
17.1.3janitor
17.1.4sjmisc
17.2Wrangling
17.2.1tidyr
17.2.2janitor
17.2.3visdat
17.3Imputation
References
writtenwithbookdown
Rfordatascience:tidyverseandbeyond
1.4summarize()
最后一个核心函数是summarize(),它用来计算摘要统计量,可以将数据框折叠成一行:
##计算平均出发延误时间
summarize(flights,delay=mean(dep_delay,na.rm=TRUE))
#>#Atibble:1x1
#>delay
#>
group_by()函数与summarize()联合使用的时候可以将分析单位从整个数据集更改为单个分组,接下来,在分组后的数据框上使用dplyr函数时,它们会自动应用到每个分组。
更简单第说,你想从哪个层级上分析问题,就在group_by中对什么层级进行分组。
group_by()+summarize()可以实现类似aggregate()函数的效果。
例如,我们想知道每一天的平均出发延误时间,可以先对(year,month,day)进行分组,然后再使用summarize():
flights%>%
group_by(year,month,day)%>%
summarize(delay=mean(dep_delay,na.rm=T))
#>#Atibble:365x4
#>#Groups:year,month[12]
#>yearmonthdaydelay
#>
这个生成的数据框只有365行,因为flights数据集中的时间跨度只有一年,(year,month,day)的唯一组合只可能有365个,这就是summarize()中的摘要函数的折叠效果:接受一个向量,只返回一个值,然后再用分组变量的一个组合来标识这个摘要量的对象(哪个层级上的平均值、最大值?)。
从这个角度看,summarize()和mutate()对函数的要求恰好相反。
用aggregate()函数的写法:
aggregate(dep_delay~year+month+day,
FUN=mean,
data=flights)%>%
head(20)
#>yearmonthdaydep_delay
#>120131111.549
#>220132110.853
#>320133111.016
#>420134112.421
#>52013512.903
#>62013612.778
#>720137156.234
#>820138134.574
#>92013914.233
#>102013101-0.099
#>11201311113.273
#>1220131219.004
#>1320131213.859
#>142013225.422
#>152013328.027
#>162013428.260
#>172013526.389
#>1820136234.013
#>1920137219.285
#>2020138213.254
比较这两个结果,我们可以发现group_by()中越靠后的参数是越基本的单位,group_by(year,month,day)将按照day,month,year的顺序开始循环;而aggregate()函数则正好相反
1.4.1Missingvaluesinsummarize()
在按照日期计算平均出发延误时间的例子中,使用mean()时设置了参数na.rm=T,如果没有这样做,很多日期的平均延误时间将是缺失值:
flights%>%
group_by(year,month,day)%>%
summarize(delay=mean(dep_delay))
#>#Atibble:365x4
#>#Groups:year,month[12]
#>yearmonthdaydelay
#>
好在所有聚合函数都有一个na.rm参数,可以在计算前出去缺失值。
在这个示例中,缺失值来源于取消的航班。
我们也可以先取出取消的航班来解决却实质问题。
保存去除缺失值的数据集为not_cancelled,以便我们可以在接下来的几个示例中继续使用:
not_cancelled%
filter(!is.na(dep_delay),!is.na(arr_delay))
not_cancelled%>%
group_by(year,month,day)%>%
summarize(delay=mean(dep_delay))
#>#Atibble:365x4
#>#Groups:year,month[12]
#>yearmonthdaydelay
#>
如果想要计算唯一值的数量,可以使用n_distinct()
##哪个目的地有最多的航空公司?
flights%>%
group_by(dest)%>%
summarize(carriers=n_distinct(carrier))%>%
arrange(desc(carriers))
#>#Atibble:105x2
#>destcarriers
#>,
#>#vehicles
,starships
,n
例如,可以使用一下代码算出每架飞机飞行的总里程(实际上就是按计算某变量分组上另一个变量的和):
not_cancelled%>%
count(tailnum,wt=distance)
#>#Atibble:4,037x2
#>tailnumn
#>
这样就可以检查一下,以确保自己没有基于非常有限的样本做结论。
例如,查看一下具有最长平均到达延误时间的飞机(基于飞机编号进行识别):
delays%
group_by(tailnum)%>%
summarize(delay=mean(arr_delay))
ggplot(delays)+
geom_histogram(aes(delay))
有些飞机的平均到达延误事件竟然接近300分钟,我们可以画一张航班数量和平均延误时间的散点图,一遍获得更深刻的理解:
##n=n()对group_by中的变量水平进行计数,生成一个计数变量命名为n
delays%
group_by(tailnum)%>%
summarize(
delay=mean(arr_delay),
n=n())
ggplot(delays)+geom_point(aes(x=n,y=delay),alpha=0.1)
从散点图可以看出,如果航班对应的出航次数非常少时,平均延误时间的变动特别大,所有延误时间较长的航班的出航次数几乎都在0右边一点点。
这张图的形状非常能说明问题:当绘制均值(或其他摘要统计量)和分组规模的关系时,总能看到样本量的增加,变动在不断减小。
(样本统计量的方差随样本数变小)。
这种数据模式还有另外一种常见的变体。
我们来看一下棒球击球手的平均表现与击球次数之间的关系。
我们用Lahman包中的数据埃及算棒球大联盟中的每个棒球队员的加大率(安打数/打数):
library(Lahman)
batters%
group_by(playerID)%>%
summarize(
ba=sum(H,na.rm=T)/sum(AB,na.rm=T),
ab=sum(AB,na.rm=T))
batters%>%
filter(ab>100)%>%
ggplot(aes(ab,ba))+
geom_point()+
geom_smooth(se=FALSE)
当绘制击球手的能力(用打击率ba衡量)与击球机会数量(用总打数ab衡量)之间的关系时,可以看到两个趋势:
总大数越多,不同击球手的打击率之间变动越小
能力(ba)和击球机会数量(ab)之间存在正相关。
这是因为球队会控制击球手的出场,很显然,球队会优先选择最好的队员。
这对球员排名也有重要印象,如果只是使用desc(ba)进行排序,明显受益的将是那些因为出场数很少而侥幸有很高击打率的球员,而不是真正能力最高的球员:
batters%>%
arrange(desc(ba))
#>#Atibble:19,428x3
#>playerIDbaab
#>
这使得sum()和mean()非常适用于逻辑值:sum()可以找出x中TRUE的数量,mean()则可以找出比例。
##每天中有多少架航班是在早上5点前出发的?(这通常表明前一天延误的航班数量)
not_cancelled%>%
group_by(year,month,day)%>%
summarize(n_early=sum(dep_time<500))
#>#Atibble:365x4
#>#Groups:year,month[12]
#>yearmonthdayn_early
#>
##将聚合函数和逻辑筛选组合起来使用
not_cancelled%>%group_by(year,month,day)%>%summarize(
##延误时间的中位数
arr_delay1=median(arr_delay),
##正延误时间的中位数
arr_delay2=median(arr_delay[arr_delay>0])
)
#>#Atibble:365x5
#>#Groups:year,month[12]
#>yearmonthdayarr_delay1arr_delay2
#>
四分位距INterquartileRangeIQR(x)和绝对中位差mad(x)基本等价,更适合有离群点的情况:
##为什么到某些目的地距离比到其他目的地更多变?
not_cancelled%>%group_by(dest)%>%summarize(distance_sd=sd(distance))%>%arrange(desc(distance_sd))
#>#Atibble:104x2
#>destdistance_sd
#>
例如quantile(x,0.25)会找出x中按从小到大顺序大于前25%而小于后75%的值(即下四分位数)
##每天最早和最晚的航班何时出发?
not_cancelled%>%group_by(year,month,day)%>%summarize(first=min(dep_time),last=max(dep_time))
#>#Atibble:365x5
#>#Groups:year,month[12]
#>yearmonthdayfirstlast
#>
##找出每天排在第10的的出发时间记录
not_cancelled%>%
group_by(month,year,day)%>%
summarize(tenth_dep=nth(dep_time,10))
#>#Atibble:365x4
#>#Groups:month,year[12]
#>monthyeardaytenth_dep
#>
换句话说,对分组结果再求和就是对整体求和,但各分组中的中位数的中位数可不是整体的中位数。
延伸文章資訊
- 1R環境下的大數據運算
如同我們剛剛講的,我們透過Spark在hadoop上進行資料的計算,你所命名計算 ... 多少個數,另外我們仍能透過colnames()函數來瞭解資料的每個欄位名稱。
- 2R語言計算各會員於各門市的出現次數
大家好: 想請教如何用R計算各個ID於各個門市的消費次數(圖中紅字欄位) https://ithelp.ithome.com.tw/upload/images/ 最終目標: 找出各個ID最常出沒...
- 37 探索式資料分析| 資料科學與R語言 - 曾意儒Yi-Ju Tseng
量化分析方式的測量值大多可用R的內建函數完成計算,但是在探索式分析時,常常需要遇 ... 計算NBA各隊的球員數與平均助攻數,球員個數的計算在 data.table 內可使用 .
- 4R语言:lengths计算列表list中元素的个数 - CSDN博客
R语言:lengths计算列表list中元素的个数 ... 这次介绍一个大家可能会用到的函数,但是又与我们常用的函数有所区别。 lengths. 一 ...
- 5R统计数据中某个值的个数- 日记 - 豆瓣
R统计数据中某个值的个数sum(cldata==32766) #数据中32766出现的个数sum(is.na(cldata)) #数据中缺失值出现的个数.