dplyr 后面对 mutate 和 filter 这两个函数进行了补充,使得功能更加强大。最大的好处就是可以对任何
列进行变换,但输出结果仍为所有列

library(tidyverse)
## ─ Attaching packages ─────────────────────── tidyverse 1.2.1 ─
## ✔ ggplot2 3.2.0     ✔ purrr   0.3.2
## ✔ tibble  2.1.3     ✔ dplyr   0.8.3
## ✔ tidyr   0.8.3     ✔ stringr 1.4.0
## ✔ readr   1.3.1     ✔ forcats 0.4.0
## ─ Conflicts ──────────────────────── tidyverse_conflicts() ─
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()

filter_all 对所有变量进行条件筛选

筛选所有列都大于 0 的观测数据

filter_all(mtcars,all_vars(.>0)) %>% head()
##    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## 1 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## 2 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## 3 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## 4 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## 5 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## 6 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2

筛选某一列大于 100的观测数据

filter_all(mtcars,any_vars(.>100)) %>% head()
##    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## 3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## 4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## 5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## 6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

filter_at
选择特定的变量进行条件筛选

筛选变量名有 ’d’的列,在这些列中找出变量值大于2的观测数据

filter_at(mtcars,vars(contains('d')),any_vars(.>2)) %>% head()    # 返回所有列
##    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## 3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## 4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## 5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## 6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
mtcars %>% select(contains('d')) %>% filter_all(all_vars(.>2)) %>% head()  # 这个只能返回选择的列
##   disp drat
## 1  160 3.90
## 2  160 3.90
## 3  108 3.85
## 4  258 3.08
## 5  360 3.15
## 6  225 2.76

这里的 vars()函数用于选择变量

filter_if
更复杂一点,我们仅需要对整数列进行筛选,就要用到 filter_if ,它的第二个参数为一个匿名函数

filter_if(mtcars,~all(floor(.) == .),all_vars(. != 0)) %>% head()
##    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## 1 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## 2 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## 3 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## 4 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## 5 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## 6 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2

mutate_all
对所有变量进行转换

iris_test <- iris %>% select(-Species)
mutate_all(iris_test,~.+2) %>% head()
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1          7.1         5.5          3.4         2.2
## 2          6.9         5.0          3.4         2.2
## 3          6.7         5.2          3.3         2.2
## 4          6.6         5.1          3.5         2.2
## 5          7.0         5.6          3.4         2.2
## 6          7.4         5.9          3.7         2.4

mutate_at 选择特定的某些列变换

mutate_at(iris,vars(contains('Sepal')),~log(.)) %>% head()
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1     1.629241    1.252763          1.4         0.2  setosa
## 2     1.589235    1.098612          1.4         0.2  setosa
## 3     1.547563    1.163151          1.3         0.2  setosa
## 4     1.526056    1.131402          1.5         0.2  setosa
## 5     1.609438    1.280934          1.4         0.2  setosa
## 6     1.686399    1.360977          1.7         0.4  setosa

mutate_if
利用更复杂的方式选择列

mutate_if(iris,is.numeric,~log(.)) %>% head()
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1     1.629241    1.252763    0.3364722  -1.6094379  setosa
## 2     1.589235    1.098612    0.3364722  -1.6094379  setosa
## 3     1.547563    1.163151    0.2623643  -1.6094379  setosa
## 4     1.526056    1.131402    0.4054651  -1.6094379  setosa
## 5     1.609438    1.280934    0.3364722  -1.6094379  setosa
## 6     1.686399    1.360977    0.5306283  -0.9162907  setosa