dplyr包笔记

作者: xuzhougeng | 来源:发表于2018-03-17 16:51 被阅读77次

    dplyr包是R语言数据处理的神器,这里记录一点刚学到的东西。

    以下操作基于R语言自带数据集"mtcars".

    变量选取: select

    • starts_with(): starts with a prefix
    • ends_with(): ends with a prefix
    • contains(): contains a literal string
    • matches(): matches a regular expression
    • num_range(): a numerical range like x01, x02, x03.
    • one_of(): variables in character vector.
    • everything(): all variables.

    观测值过滤: filter

    dplyr提供filter,filter_at,filter_all,filter_if用来对行数据进行过滤,仅保留符合要求的行。

    filter用来处理特定的几个变量,比如说:

    # 保留mtcars中cyl为6的行
    filter(mtcars, cyl==6)
    # 保留cyl为6但是vs不为0的行
    filter(mtcars, cyl==6, vs != 0)
    

    功能比较简单,适用于处理特定几列。但是如果你想要在包含10多个变量的数据框中找到包含NA的行,肯定不能逐个变量写判断语句,这就需要用到filter_all

    filter_all(mtcars, any_vars(is.na(.)))
    

    这里的any_vars表示任意一列,.则指代当前选定列,那么is.na(.)就会返回当前列的布尔值向量。

    或者如果你的变量命命名很有特点,那么可以使用filter_at判断变量名是否符合要求来选择列:

    #判断变量名里有‘d’的列是否为NA.
    filter_at(mtcars, vars(contains('d')), any_vars(is.na(.)))
    # 判断变量名中含有'd'的列中,所有值是否都大于3
    filter_at(mtcars, vars(contains('d')), all_vars(.>3))
    

    这里的vars()函数用于选择变量,可以用select里用到筛选函数对变量名进行判断, 比如说contains()就返回变量命包含某个字符的变量。

    更复杂一点,如果我们仅需要对那些整数列进行筛选,那么就需要用到filter_if, 因为它的第二个参数会传递给rlang::as_function用于构造闭包,而闭包则是一种函数。

    filter_if(mtcars, ~all(floor(.) == .), all_vars(.!=0))
    

    ~all(floor(.) ==.)的参数选择下,最后是对cyl, hp, vs, am, gear, carb这几列进行处理,可以用如下的方式进行验证。

    filter_if(mtcars, ~ all(floor(.) == .), all_vars(. == 4))
    

    由于hpb里不存在一个值为4,那么all_vars返回的是全FALSE的向量。

    相关文章

      网友评论

        本文标题:dplyr包笔记

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