美文网首页
dplyr 数据处理

dplyr 数据处理

作者: 龙小江i | 来源:发表于2018-11-10 20:22 被阅读0次

    dplyr 是plyr的增强版,名称中的d表名了它是一个专注于处理数据框的R包,dplyr提供了灵活的数据操作语法。其特点如下:

    1. 识别最重要的数据操作动词,并使其易于使用。
    2. 通过在C ++中编写关键部分(使用Rcpp)为内存数据提供极快的性能
    3. 使用相同的界面处理数据,无论数据存储在何处(数据框、数据表或者数据库)

    注:本文所用数据来自nycflights13::flights,该数据集包含2013年从纽约市出发的所有336776个航班信息。
    用dplyr 包处理数据时,要先将数据转化成tbl_df 的tibble类型的数据(flights数据集不需要转换,这里仅作演示)

    # 导入包
    library(nycflights13)
    # 检索数据集
    dim(flights)
    # 转换数据
    flights <- tbl_df(flights)
    

    筛选:

    filter(数据集, 条件1 & 条件2 ...)

    类似于SQL的where语句,条件选择操作。filter() 和slice()函数可以按给定的逻辑条件筛选出符合要求的子数据集, 类似于 base::subset() 函数,但代码更加简洁, 同时也支持对同一对象的任意个条件组合(表示AND时要使用&或者直接使用逗号),返回与.data相同类型的对象。原数据集行名称会被过滤掉。

    # 查询所有1月1号的航班
    filter(flights, month == 1 & day == 1)
    # 等同于下面这条语句
    flights[flights$month == 1 & flights$day == 1, ]
    

    排列:

    arrange(数据集, 变量1, 变量2, 变量3 ...)

    arrange()按给定的列名依次对行进行排序,类似于base::order()函数。默认是按照升序排序,对列名加 desc() 可实现倒序排序。原数据集行名称会被过滤掉。

    # 按照年、月、日升序排列
    arrange(flights, year, month, day)
    # 航班到达延误字段用desc()按降序排列
    arrange(flights, desc(arr_delay))
    

    查询:

    select(数据集, 变量1, 变量2, 变量3 ...)

    select()用列名作参数来选择子数据集。dplyr包中提供了些特殊功能的函数与select函数结合使用, 用于筛选变量,包括starts_with,ends_with,contains,matches,one_of,num_range和everything等。用于重命名时,select()只保留参数中给定的列,rename()保留所有的列,只对给定的列重新命名。原数据集行名称会被过滤掉。

    # 查询年、月、日字段
    select(flights, year, month, day)
    # 等同于下面这条语句
    select(flights, year:day)
    # 查询除年、月、日字段以外的所有字段
    select(flights, -(year:day))
    

    添加:

    mutate(数据集, 变量1 = 条件, 变量2 = 条件 ...)

    mutate()和transmute()函数对已有列进行数据运算并添加为新列,类似于base::transform() 函数, 不同的是可以在同一语句中对刚增添加的列进行操作。mutate()返回的结果集会保留原有变量,transmute()只返回扩展的新变量。原数据集行名称会被过滤掉。

    # 计算航班延迟时间和速度(不保留新变量)
    mutate(flights,
           gain = arr_delay - dep_delay,
           speed = distance / air_time * 60
    )
    # 不保留新变量,但引用新建的变量
    mutate(flights,
      gain = arr_delay - dep_delay,
      speed = distance / air_time * 60
    )
    # 计算航班延迟时间和延迟时间占比(保留新变量)
    transmute(flights,
              gain = arr_delay - dep_delay,
              gain_per_hour = gain / (air_time / 60)
    )
    

    统计:

    summarise(数据集, 条件)

    对数据框调用函数进行汇总操作, 返回一维的结果。返回多维结果时会报如下错误:
    Error: expecting result of length one, got : 2
    原数据集行名称会被过滤掉。

    # 计算航班平均延迟时间
    summarise(flights,
              delay = mean(dep_delay, na.rm = TRUE)
    )
    

    去重:

    distinct(数据集, 去重对象)

    distinct()用于对输入的tbl进行去重,返回无重复的行,类似于 base::unique() 函数,但是处理速度更快。原数据集行名称会被过滤掉。

    # 对月份去重
    distinct(flights, month)
    

    抽样:

    sample_n(数据集, 抽取数量 ...)

    sample_frac(数据集, 抽取比例 ...)

    sample_n()随机抽取指定数目的样本,sample_frac()随机抽取指定百分比的样本,默认都为不放回抽样,通过设置replacement = TRUE可改为放回抽样,可以用于实现Bootstrap抽样。
    sample_n(tbl, size, replace = FALSE, weight = NULL, .env = NULL)
    sample_frac(tbl, size = 1, replace = FALSE, weight = NULL, .env = NULL)

    # 随机无重复的取10行数据
    sample_n(flights, 10)
    # 随机无重复的取10%的数据
    sample_frac(flights, 0.1)
    

    相关文章

      网友评论

          本文标题:dplyr 数据处理

          本文链接:https://www.haomeiwen.com/subject/lwttfqtx.html