title: R_6 dplyrdate: 2021-07-11
tags: R语言
categories: 学习
mathjax: true
使用dplyr操作数据
dplyr是一个外部包,在使用前需要先加载。
#install.packages("dplyr")#已经安装过了
library("dplyr")
加载一个数据集presidentialElections
#install.packages("pscl")#已经安装过了
library("pscl")
1. 选择
使用select()函数从数据框中选择列。
votes <- select(presidentialElections,year,demVote)#不带引号
#也可以用基础语法
#votes <- presidentialElections[,c("year","demVote")]
#select函数的参数可以是列名向量
select(presidentialElections,state:year)#选state到year
select(presidentialElections,-south)#排除south
使用select函数选择单列也返回数据框而不是向量。
2. 过滤
使用filter()函数提取行,也可以叫过滤。
votes2008 <- filter(
presidentialElections,
year == 2008
)
votes_colorado_2016 <- filter(
presidentialElections,
year == 2016,
state == "Colorado"
)
3. 修改
使用mutate函数创建额外的列。
presidentialElections <- mutate(
presidentialElections,
other_parties_vote = 100 - demVote,#每一列都是向量
abs_vote_difference = abs(demVote - other_parties_vote)
)
使用rename()函数对某列重命名。
rename(
presidentialElections,
other_vote = other_parties_vote
)
使用arrange()函数对数据框中的行进行排序。先按照第一个参数进行排序,第一个参数相同时按照第二个参数排序。参数名前加负号表示降序,不加负号表示升序。
presidentialElections <- arrange(
presidentialElections,
-year,
demVote
)
4. 汇总
使用summarize()函数生成一个包含summary列的新数据框。任何以向量为参数,返回单个值的函数都可以用在summarize函数中,也可以自己编写函数。
5. 管道操作
管道运算符%>%可以从一个函数获取结果,将其作为第一个参数传给下一个函数。
例:在2008年的美国选举中,哪个州对民主党候选人奥巴马的支持率最高?
#不使用管道操作符,会产生一系列的中间变量
vote_2008 <- filter(presidentialElections, year == 2008)
most_dem_vote <- filter(vote_2008, demVote == max(demVote))
# 注意选择出的行符合过滤的条件为真。并不是选择max(demVote)
most_dem_state <- select(most_dem_vote, state)
most_dem_state2 <- presidentialElections %>%
filter(year == 2008) %>%
filter(demVote == max(demVote)) %>%
select(state)#注意没有逗号
6. 按组分析数据框
使用group_by()函数对数据框进行分组。第一个参数是需要分组的数据框,第二个参数是用于分组数据的列,该列值相同的行分为一组。group_by()函数返回一个tibble,一种特殊的数据框,而不是显式地将原数据框重新排列。
mean_state_demVote <- presidentialElections %>%
group_by(state) %>%
summarize(
mean_state_demVote = mean(demVote)
)
7. 连接数据框
使用left_join()函数连接两个数据框,第一、二个参数指定左右表,使用by参数指定需要匹配的参数。
donations <- read.csv("donations.csv")
donors <- read.csv("donors.csv")
combined_data <- left_join(donations,donors,by = "donor_name")
注意首先遍历左侧表,连接后的donor_name列一定和左表相同。如果右侧表中没有左侧表对应值,则用NA代替。right_join()函数的功能恰好相反。
如果只想匹配特定的列,指定donor_name的值。
combined_specified_data <-
left_join(donations, donors,by = c("donor_name" = "name"))
除了左连接和右连接以外,还有内连接(交)和完全连接(并)。
8.dplyr实战:分析飞行数据
8.1 加载数据库
# install.packages("nycflights13")
library("nycflights13")
8.2 了解数据集的结构
?flights
dim(flights)
colnames(flights)
View(flights)
8.3 解决问题
问题一:哪家航空公司延迟起飞的次数最多?
most_delay <- flights %>%
group_by(carrier) %>%
filter(dep_delay > 0) %>%
summarize(num_delay = n()) %>%#函数n()返回组的规模
filter(num_delay == max(num_delay)) %>%
select(carrier) %>%
left_join(airlines, by = "carrier") %>%
select(name)
问题二:平均来说,航班最早到达哪个机场?
注意有NA值时一定要删除NA值!
earliest_arrive <- flights %>%
group_by(dest) %>%
summarize(delay = mean(arr_delay, na.rm = TRUE)) %>% #删除na值
filter(delay == min(delay, na.rm = TRUE)) %>%
select(dest) %>%
left_join(airports, by = c("dest" = "faa")) %>%
select(name)
问题三:航班在哪个月延误最久?
longest_delay <- flights %>%
group_by(month) %>%
summarize(avg_delay = mean(arr_delay, na.rm = TRUE)) %>%
filter(avg_delay == max(avg_delay, na.rm = TRUE)) %>%
select(month)
print(longest_delay)