使用dplyr包处理数据-学习笔记

# dplyr 基础

  • 按值筛选观测 filter()

  • 对行进行重新排序 arrange()

  • 按名称选取列变量 select()

  • 使用现有变量的函数创建新变量 mutate()

  • 将多个值总结为一个摘要统计量 summarize()

  • 以上函数与group_by()函数连用,group_by()可以改变函数的作用范围;让其从整个数据集上的操作变为在每个分组上的分别操作 group_by()

# 数据
nycflights13::flights, 2013年从纽约出发的336 776次航班的信息。

> install.packages("nycflights13")
> library(dplyr)
> library(nycflights13)
> head(flights)
# A tibble: 6 x 19
   year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest  air_time
                                                         
1  2013     1     1      517            515         2      830            819        11 UA        1545 N14228  EWR    IAH        227
2  2013     1     1      533            529         4      850            830        20 UA        1714 N24211  LGA    IAH        227
# ... with 4 more variables: distance , hour , minute , time_hour 

# 使用filter()筛选行
filter(.data, ...)
.data是数据框;
...:后面可以是一个或多个参数,但必须是逻辑值,从而保证为TRUE的行才保留。

#筛选1月1日的航班
> filter(flights,month==1,day==1)
# A tibble: 842 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest  air_time
                                                          
 1  2013     1     1      517            515         2      830            819        11 UA        1545 N14228  EWR    IAH        227

## 比较运算符
>, >=, <, <=, !=, ==
浮点数相等使用near()代替==

## 逻辑运算符
& 表示“与”, | 表示“或”, !表示“非”, xor(x,y) 表示“异或”

> x <- c(T,T,F)
> y <- c(F,T,F)
> xor(x,y)
[1]  TRUE FALSE FALSE

## 缺失值
NA:not available, 不可用;
is.NA()
# 使用arrange()排列行
arrange(.data, ...)
.data:数据框
...:变量名,多个变量名使用逗号隔开; arrange()将根据这些列对数据框进行排序;

> arrange(flights,year,month,day)
# A tibble: 336,776 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest  air_time
                                                          
 1  2013     1     1      517            515         2      830            819        11 UA        1545 N14228  EWR    IAH        227
 2  2013     1     1      533            529         4      850            830        20 UA        1714 N24211  LGA    IAH        227

使用desc() 可以按列进行降序排序:

> arrange(flights,desc(arr_delay))

# 使用select()选择列
select(.data, ...):keeps only the variables you mention

> select(flights,year,month,day)
> select(flights,year,month,day)
# A tibble: 336,776 x 3
    year month   day
     
 1  2013     1     1
 2  2013     1     1
 3  2013     1     1
 4  2013     1     1
 5  2013     1     1
 6  2013     1     1
 7  2013     1     1
 8  2013     1     1
 9  2013     1     1
10  2013     1     1
# ... with 336,766 more rows
> select(flights,year:day)
> select(flights,-(year:day))  #删除列

select()函数可以结合一些辅助函数使用:
start_with("abc"): 匹配“abc”开头
ends_with(): 匹配“xyz” 结尾的名称
contains("ijk"): 匹配包含“ijk”的名称
mathces("(.)\1"): 匹配名称中有重复字符的变量;(.)匹配单个字符;\\1指定第一个子匹配项, 第二个匹配模式也是(.)。
num_range("x",1:3): 匹配x1、x2和x3
rename(): 可以对数据框中变量名重命名。

> rename(flights,tail_num = tailnum)
# A tibble: 336,776 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight
                                                
 1  2013     1     1      517            515         2      830            819        11 UA        1545
 2  2013     1     1      533            529         4      850            830        20 UA        1714
# ... with 336,766 more rows, and 8 more variables: tail_num , origin , dest ,
#   air_time , distance , hour , minute , time_hour 

# 使用mutate添加新变量
mutate()总是将新列添加在数据集的最后

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

>mutate(iris,newCol1=iris$Sepal.Length*2,newCol2=paste(iris$Species,iris$Sepal.Length,sep = ""))
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species newCol1       newCol2
1            5.1         3.5          1.4         0.2     setosa    10.2     setosa5.1
2            4.9         3.0          1.4         0.2     setosa     9.8     setosa4.9
3            4.7         3.2          1.3         0.2     setosa     9.4     setosa4.7
4            4.6         3.1          1.5         0.2     setosa     9.2     setosa4.6
5            5.0         3.6          1.4         0.2     setosa    10.0       setosa5

transmute()只保留新变量

>transmute(iris,newCol1=iris$Sepal.Length*2,newCol2=paste(iris$Species,iris$Sepal.Length,sep = ""))
    newCol1       newCol2
1      10.2     setosa5.1
2       9.8     setosa4.9
3       9.4     setosa4.7
4       9.2     setosa4.6
5      10.0       setosa5

# 使用summarize()进行分组摘要

group_by()可以将分析单位从整个数据集改为单个分组
ungroup()可以取消分组

> bySpecies<-group_by(iris,Species)
> summarize(bySpecies, meanCol=mean(iris$Sepal.Length,na.rm = T))
# A tibble: 3 x 2
  Species    meanCol
          
1 setosa        5.84
2 versicolor    5.84
3 virginica     5.84
> by_day<-group_by(flights,year,month,day)  #flights中year,month,day各水平一一组合

使用管道操作: %>%,输入数据或者计算结果通过%>%直接传递给下一步操作

by_dest<-group_by(flights,dest)
delay<-summarize(by_dest,
                 count=n(),  #n()是一个计数函数
                 dist=mean(distance,na.rm=T),
                 delay=mean(arr_delay,na.rm = T))

delay<-filter(delay,count>20,dest != "HNL")


by_dest<-flights %>%
  group_by(dest)%>%
  summarize(
    count=n(),
    dist=mean(distance,na.rm=T),
    delay=mean(arr_delay,na.rm = T)
    )%>%
  filter(count>20,dest != "HNL")

参考:
R数据科学

你可能感兴趣的:(使用dplyr包处理数据-学习笔记)