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的向量。