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