R语言学习11-数据处理
本次课程我们学习dplyr和tidyr包中的一些常用函数对数据的处理。
worldcup数据集
假设我们已经在工作空间中读入了worldcup数据,这个数据概况是这样的。
> head(worldcup)Team Position Time Shots Passes Tackles SavesAbdoun Algeria Midfielder 16 0 6 0 0Abe Japan Midfielder 351 0 101 14 0Abidal France Defender 180 0 91 6 0Abou Diaby France Midfielder 270 1 111 5 0Aboubakar Cameroon Forward 46 2 16 0 0Abreu Uruguay Forward 72 0 15 0 0
现在我们想取其中的Time, Passes, Tackles, Saves这4列,就可以使用dplyr中的select函数。
> wc_1 <- worldcup %>% select(Time, Passes, Tackles, Saves)> head(wc_1)Time Passes Tackles SavesAbdoun 16 6 0 0Abe 351 101 14 0Abidal 180 91 6 0Abou Diaby 270 111 5 0Aboubakar 46 16 0 0Abreu 72 15 0 0
上述代码中%>% 是dplyr中的管道操作符,功能类似linux中的|,作用就是将上一步的结果传给下一步作为输入。
因此worldcup %>% select(Time, Passes, Tackles, Saves) 其实就等价于 select(worldcup, Time, Passes, Tackles, Saves)。
在对数据进行多步操作时,管道操作符是很有用的一个东西。可以避免使用很多变量,以及节省内存空间。下面的操作都会基于管道操作符。
下面我们基于上述代码,对取得的4列数据进行取平均值。
> wc_2 <- worldcup %>%+ select(Time, Passes, Tackles, Saves) %>%+ summarise(Time = mean(Time), Passes = mean(Passes), Tackles = mean(Tackles), Saves = mean(Saves))> wc_2Time Passes Tackles Saves1 208.8639 84.52101 4.191597 0.6672269
通过summarise()函数可以对数据做汇总,取均值,求和或者其他操作都可以。
现在我们希望把取得结果做一个转换,变成下面这种形式。
var meanTime 208.8638655Passes 84.5210084Tackles 4.1915966Saves 0.6672269
这个时候就可以用到tidyr中的gather()函数,这个函数的作用就是把放在行里的数据,转成放在列里。
> wc_3 <- worldcup %>%+ select(Time, Passes, Tackles, Saves) %>%+ summarize(Time = mean(Time),+ Passes = mean(Passes),+ Tackles = mean(Tackles),+ Saves = mean(Saves)) %>%+ gather(var, mean)> wc_3var mean1 Time 208.86386552 Passes 84.52100843 Tackles 4.19159664 Saves 0.6672269
gather()的第一个参数,实际是前面步骤传入的数据,第二个参数var其实是给原来的表头那行转成列的列名,第三个参数mean则是原来的行值,转列后的列名。
最后,我们发现mean列的小数位数太多了,我们只想取1位小数。mutate()函数可以在原来的数据基础上新建列,或代替原来的列。所以我们可以新建mean列并取1位小数,来代替原来的mean列。
> wc_4 <- worldcup %>%+ select(Time, Passes, Tackles, Saves) %>%+ summarize(Time = mean(Time),+ Passes = mean(Passes),+ Tackles = mean(Tackles),+ Saves = mean(Saves)) %>%+ gather(var, mean) %>%+ mutate(mean = round(mean, 1))> wc_4var mean1 Time 208.92 Passes 84.53 Tackles 4.24 Saves 0.7
Titanic数据集
我们使用titanic数据集来学习以下其他操作,第一步依然是使用select()来选择其中的几列。
> titanic_1 <- titanic %>%+ select(Survived, Pclass, Age, Sex)> head(titanic_1)Survived Pclass Age Sex1 0 3 22 male2 1 1 38 female3 1 3 26 female4 1 1 35 female5 0 3 35 male6 0 3 NA male
我们看到Age列的第6行,有NA值。现在我们想把Age列是NA的行全都删掉,可以使用filter()函数。
> titanic_2 <- titanic %>%+ select(Survived, Pclass, Age, Sex) %>%+ filter(!is.na(Age))> head(titanic_2)Survived Pclass Age Sex1 0 3 22 male2 1 1 38 female3 1 3 26 female4 1 1 35 female5 0 3 35 male6 0 1 54 male
filter()会保留满足条件的行,因此is.na前面要加!,表示取反。
接下来,我们要对Age的值进行分类,分成3类,分别是Under 15, 15 to 50, Over 50。因此我们要新建一个agecat列,使用mutate()函数。分类则使用cut函数。
> titanic_3 <- titanic %>%+ select(Survived, Pclass, Age, Sex) %>%+ filter(!is.na(Age)) %>%+ mutate(agecat = cut(Age, breaks = c(0, 14.99, 50, 150),+ include.lowest = TRUE,+ labels = c("Under 15", "15 to 50", "over 50")))> head(titanic_3)Survived Pclass Age Sex agecat1 0 3 22 male 15 to 502 1 1 38 female 15 to 503 1 3 26 female 15 to 504 1 1 35 female 15 to 505 0 3 35 male 15 to 506 0 1 54 male over 50
最后,我们对Survived、Pclass、agecat这3列进行分组聚合操作,找出总人数和幸存人数,并计算幸存率。
> titanic_4 <- titanic %>%+ select(Survived, Pclass, Age, Sex) %>%+ filter(!is.na(Age)) %>%+ mutate(agecat = cut(Age, breaks = c(0, 14.99, 50, 150),+ include.lowest = TRUE,+ labels = c("Under 15", "15 to 50",+ "Over 50"))) %>%+ group_by(Pclass, agecat, Sex) %>%+ summarise(N = n(),+ survivors = sum(Survived == 1),+ perc_survived = 100 * survivors / N) %>% ungroup()> titanic_4# A tibble: 18 x 6Pclass agecat Sex N survivors perc_survived<int> <fct> <chr> <int> <int> <dbl>1 1 Under 15 female 2 1 502 1 Under 15 male 3 3 1003 1 15 to 50 female 70 68 97.14 1 15 to 50 male 72 32 44.45 1 Over 50 female 13 13 1006 1 Over 50 male 26 5 19.27 2 Under 15 female 10 10 1008 2 Under 15 male 9 9 1009 2 15 to 50 female 61 56 91.810 2 15 to 50 male 78 5 6.4111 2 Over 50 female 3 2 66.712 2 Over 50 male 12 1 8.3313 3 Under 15 female 27 13 48.114 3 Under 15 male 27 9 33.315 3 15 to 50 female 74 33 44.616 3 15 to 50 male 217 29 13.417 3 Over 50 female 1 1 10018 3 Over 50 male 9 0 0
小结
学习dplyr和tidyr中几个常用函数的使用。
•select()•group_by()•summarise()•mutate()•filter()•gather()
