title: R_6 dplyrdate: 2021-07-11
tags: R语言
categories: 学习
mathjax: true

使用dplyr操作数据

dplyr是一个外部包,在使用前需要先加载。

  1. #install.packages("dplyr")#已经安装过了
  2. library("dplyr")

加载一个数据集presidentialElections

  1. #install.packages("pscl")#已经安装过了
  2. library("pscl")

1. 选择

使用select()函数从数据框中选择列。

  1. votes <- select(presidentialElections,year,demVote)#不带引号
  2. #也可以用基础语法
  3. #votes <- presidentialElections[,c("year","demVote")]
  4. #select函数的参数可以是列名向量
  5. select(presidentialElections,state:year)#选stateyear
  6. select(presidentialElections,-south)#排除south

使用select函数选择单列也返回数据框而不是向量

2. 过滤

使用filter()函数提取行,也可以叫过滤。

  1. votes2008 <- filter(
  2. presidentialElections,
  3. year == 2008
  4. )
  5. votes_colorado_2016 <- filter(
  6. presidentialElections,
  7. year == 2016,
  8. state == "Colorado"
  9. )

3. 修改

使用mutate函数创建额外的列。

  1. presidentialElections <- mutate(
  2. presidentialElections,
  3. other_parties_vote = 100 - demVote,#每一列都是向量
  4. abs_vote_difference = abs(demVote - other_parties_vote)
  5. )

使用rename()函数对某列重命名。

  1. rename(
  2. presidentialElections,
  3. other_vote = other_parties_vote
  4. )

使用arrange()函数对数据框中的行进行排序。先按照第一个参数进行排序,第一个参数相同时按照第二个参数排序。参数名前加负号表示降序,不加负号表示升序。

  1. presidentialElections <- arrange(
  2. presidentialElections,
  3. -year,
  4. demVote
  5. )

4. 汇总

使用summarize()函数生成一个包含summary列的新数据框。任何以向量为参数,返回单个值的函数都可以用在summarize函数中,也可以自己编写函数。

5. 管道操作

管道运算符%>%可以从一个函数获取结果,将其作为第一个参数传给下一个函数。

例:在2008年的美国选举中,哪个州对民主党候选人奥巴马的支持率最高?

  1. #不使用管道操作符,会产生一系列的中间变量
  2. vote_2008 <- filter(presidentialElections, year == 2008)
  3. most_dem_vote <- filter(vote_2008, demVote == max(demVote))
  4. # 注意选择出的行符合过滤的条件为真。并不是选择max(demVote)
  5. most_dem_state <- select(most_dem_vote, state)
  1. most_dem_state2 <- presidentialElections %>%
  2. filter(year == 2008) %>%
  3. filter(demVote == max(demVote)) %>%
  4. select(state)#注意没有逗号

6. 按组分析数据框

使用group_by()函数对数据框进行分组。第一个参数是需要分组的数据框,第二个参数是用于分组数据的列,该列值相同的行分为一组。group_by()函数返回一个tibble,一种特殊的数据框,而不是显式地将原数据框重新排列。

  1. mean_state_demVote <- presidentialElections %>%
  2. group_by(state) %>%
  3. summarize(
  4. mean_state_demVote = mean(demVote)
  5. )

7. 连接数据框

使用left_join()函数连接两个数据框,第一、二个参数指定左右表,使用by参数指定需要匹配的参数。

  1. donations <- read.csv("donations.csv")
  2. donors <- read.csv("donors.csv")
  3. combined_data <- left_join(donations,donors,by = "donor_name")

注意首先遍历左侧表,连接后的donor_name列一定和左表相同。如果右侧表中没有左侧表对应值,则用NA代替。right_join()函数的功能恰好相反。

如果只想匹配特定的列,指定donor_name的值。

  1. combined_specified_data <-
  2. left_join(donations, donors,by = c("donor_name" = "name"))

除了左连接和右连接以外,还有内连接(交)和完全连接(并)。

8.dplyr实战:分析飞行数据

8.1 加载数据库

  1. # install.packages("nycflights13")
  2. library("nycflights13")

8.2 了解数据集的结构

  1. ?flights
  2. dim(flights)
  3. colnames(flights)
  4. View(flights)

8.3 解决问题

问题一:哪家航空公司延迟起飞的次数最多?

  1. most_delay <- flights %>%
  2. group_by(carrier) %>%
  3. filter(dep_delay > 0) %>%
  4. summarize(num_delay = n()) %>%#函数n()返回组的规模
  5. filter(num_delay == max(num_delay)) %>%
  6. select(carrier) %>%
  7. left_join(airlines, by = "carrier") %>%
  8. select(name)

问题二:平均来说,航班最早到达哪个机场?

注意有NA值时一定要删除NA值!

  1. earliest_arrive <- flights %>%
  2. group_by(dest) %>%
  3. summarize(delay = mean(arr_delay, na.rm = TRUE)) %>% #删除na值
  4. filter(delay == min(delay, na.rm = TRUE)) %>%
  5. select(dest) %>%
  6. left_join(airports, by = c("dest" = "faa")) %>%
  7. select(name)

问题三:航班在哪个月延误最久?

  1. longest_delay <- flights %>%
  2. group_by(month) %>%
  3. summarize(avg_delay = mean(arr_delay, na.rm = TRUE)) %>%
  4. filter(avg_delay == max(avg_delay, na.rm = TRUE)) %>%
  5. select(month)
  6. print(longest_delay)