tidyverse evaluation
时间:2022-07-25
本文章向大家介绍tidyverse evaluation,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
tidy evaluation
sunqi
2020/8/5
概述
也称作非标准评估
代码
rm(list = ls())
library("tidyverse")
library(rlang)
# 在编写代码时遇到不同数据集或者不同变量的操作比如
iris %>%
group_by(Species) %>%
summarise(mean=mean(Sepal.Length))
## # A tibble: 3 x 2
## Species mean
## <fct> <dbl>
## 1 setosa 5.01
## 2 versicolor 5.94
## 3 virginica 6.59
# 如果换个变量,那么就需要重新编写代码
# 于是乎,想到了用自定义函数进行重复性的操作
# 但是R语言函数的传递和python是不一样的
# 因此,在tidyverse中,对这种情况进行了解决
# !!对表达式求解
# quo 生成表达式
group_mean <- function(data, var_group,varname, var_mean) {
data %>%
# 对变量进行!!
group_by(!!var_group) %>%
summarise(!!varname:=mean(!!var_mean))
}
# 调用的时候使用quo函数
group_mean(data=iris,
var_group=quo(Species),
varname="mean_sepal.length",
var_mean=quo(Sepal.Length))
## # A tibble: 3 x 2
## Species mean_sepal.length
## <fct> <dbl>
## 1 setosa 5.01
## 2 versicolor 5.94
## 3 virginica 6.59
# 上述函数实现了对字符和函数名的调用
# 但是输入的时候需要书写quo
# 这个时候可以使用enquo
group_mean <- function(data, var_group,varname, var_mean) {
var_group <- enquo(var_group)
var_mean <- enquo(var_mean)
data %>%
group_by(!!var_group) %>%
summarise(!!varname:=mean(!!var_mean))
}
group_mean(data=iris,
var_group=Species,
varname="mean_sepal.length",
var_mean=Sepal.Length)
## # A tibble: 3 x 2
## Species mean_sepal.length
## <fct> <dbl>
## 1 setosa 5.01
## 2 versicolor 5.94
## 3 virginica 6.59
## 上述代码的两次引用还是不太方便
## 使用大括号
## 大括号同时包含的转换表达式和求解表达式
group_mean <- function(data, var_group,varname, var_mean) {
data %>%
group_by({{var_group}}) %>%
summarise({{varname}}:= mean ({{var_mean}}))
}
group_mean(data=iris,
var_group=Species,
varname="mean_sepal.length",
var_mean=Sepal.Length)
## # A tibble: 3 x 2
## Species mean_sepal.length
## <fct> <dbl>
## 1 setosa 5.01
## 2 versicolor 5.94
## 3 virginica 6.59
# 现版本的tidyverse还可以这样写函数
# across函数支持对队列执行相同的操作
sum_group_vars <- function(data,
group_vars,
sum_vars){
data %>%
group_by(across({{ group_vars }})) %>%
summarise(n = n(),
across({{ sum_vars }},
list(mean = mean, sd = sd))
)
}
# 调用函数
sum_group_vars(mpg, c(model, year), c(hwy, cty)) %>% head()
## # A tibble: 6 x 7
## # Groups: model [3]
## model year n hwy_mean hwy_sd cty_mean cty_sd
## <chr> <int> <int> <dbl> <dbl> <dbl> <dbl>
## 1 4runner 4wd 1999 4 19 1.41 15.2 0.5
## 2 4runner 4wd 2008 2 18.5 2.12 15 1.41
## 3 a4 1999 4 27.5 1.73 18.2 2.06
## 4 a4 2008 3 29.3 2.08 19.7 1.53
## 5 a4 quattro 1999 4 25.2 0.5 16.5 1.29
## 6 a4 quattro 2008 4 26.2 1.5 17.8 2.22
# 处理多个参数
# 使用... 代替传递参数
grouped_mean <- function(df, summary_var, ...) {
summary_var <- enquo(summary_var)
group_var <- enquos(...)
df %>%
group_by(!!!group_var) %>%
summarise(mean = mean(!!summary_var))
}
# 运行函数
# 这里传递两个分组变量
grouped_mean(mtcars, disp, cyl, am)
## # A tibble: 6 x 3
## # Groups: cyl [3]
## cyl am mean
## <dbl> <dbl> <dbl>
## 1 4 0 136.
## 2 4 1 93.6
## 3 6 0 205.
## 4 6 1 155
## 5 8 0 358.
## 6 8 1 326
## 试试ggplot
## 编写一个绘制iris箱式图的函数
box <- function(data, var_group, var_target) {
data %>% ggplot(aes(x={{var_group}},y={{var_target}}))+
geom_boxplot()
}
box(data = iris,var_group = Species,var_target = Sepal.Length)
结束语
这么久以来,这是我最喜欢的一个R脚本,解决了我一直以来函数编写的问题,以前都是使用eval(parse(text=“代码字符串”))来实现自定义函数的传递功能,另外R for data science,这本书贵不贵?,想买一本看看。
love&peace
- 数据库中间件 MyCAT 源码解析 —— 分片结果合并(一)
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(一)之分库分表配置
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 解析(六)之删除SQL
- 数据库[分库分表]中间件 Sharding-JDBC 源码分析 —— SQL 解析(五)之更新SQL解析
- ExtJs+WCF+LINQ实现分页Grid
- 数据库[分库分表]中间件 Sharding-JDBC 源码分析 —— SQL 解析(四)之插入SQL
- 基于sliverlight + wcf的web 文字版IM 示例
- 数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(三)之查询SQL
- zephir-(11)流程控制语句
- phalcon-入门篇7(Model层基础使用)
- Sharding-JDBC 源码分析 —— SQL 解析(二)之SQL解析
- zephir-(1)开篇介绍
- phalcon-入门篇6(控制器)
- phalcon-入门篇5(请求与返回)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微信小程序语音同步智能识别的实现案例
- 数据结构之链式队列的代码实现及有趣应用
- 用自定义链式栈解决力扣括号匹配问题
- String及StringTable(三):StringBuilder源码解读
- UidGenerator:百度开源的分布式ID服务(解决了时钟回拨问题)
- String及StringTable(四):StringBuffer与StringBuilder对比
- Apache James 2.3.2.1 邮箱服务搭建
- SpringBoot实现微信小程序登录的完整例子
- String及StringTable(五):java8的新工具类StringJoiner
- spring security oauth2使用refresh_token报错UserDetailsService is required
- 你所不知道的React| 趋势解读、底层逻辑、学习路径、实战应用
- js中setTimeout的用法和JS计时器setTimeout与setInterval方法的区别和confirm方法
- TKinter Label 和 Button
- Java类如何防止被实例化
- PHP中的json_encode和json_decode