r - 通过函数在 dplyr 中动态构造 mutate 中的变量名
问题描述
我想做一个函数,我可以在其中提供数据集和前缀列表。它使用这些前缀来构造涉及使用这些前缀的列,并返回最终数据集,如下所示:
data <- data.frame(demo1_a = 3,demo1_b = 5, demo2_a = 4,demo2_b = 5)
make_vars(data, prefixes = list('demo1', 'demo2'))
make_vars <- function(data, prefixes){
for(i in prefixes){
data = data %>%
mutate({i}_subtraction = {i}_a - {i}_b,
{i}_addition = {i}_a + {i}_b,
)
}
return(data)
}
结果 data.frame 看起来像:
demo1_a demo1_b demo2_a demo2_b demo1_subtraction demo1_addition demo2_addition demo2_subtraction
1 3 5 4 5 -2 8 9 -1
我在这个答案中看到:https ://stackoverflow.com/a/59224230/372526 ,它们引用了卷曲运算符({{}}),rlang
其中允许您动态引用变量名,但我还没有找到如何通过函数“粘贴”其他后缀,如“_subtraction”和“_b”。
解决方案
这是我提出的解决方案
library(tidyverse)
data <- data.frame(a = 1, b = 2, demo1_a = 3,demo1_b = 5, demo2_a = 4,demo2_b = 5)
my_mutate <- function(df, name) {
name_a <- paste0(name,"_a")
name_b <- paste0(name,"_b")
name_add <- paste0(name,"_addition")
name_sub <- paste0(name,"_subtraction")
df %>%
mutate(!! name_add := !! rlang::parse_expr(name_a) + !! rlang::parse_expr(name_a),
!! name_sub := !! rlang::parse_expr(name_a) - !! rlang::parse_expr(name_a))
}
data %>%
my_mutate("demo1") %>%
my_mutate("demo2")
如果您需要传递姓名列表
vector_names <- c("demo1","demo2")
loop_mutate <- function(df, vector_names) {
for (i in vector_names) {
df <- df %>% my_mutate(i)
}
df
}
loop_mutate(data,vector_names = vector_names)
推荐阅读
- excel - Excel 连接到 Oracle 数据库
- php - PhpStorm 警告“预期类,得到类 []”
- java - 如何从 Java REST servlet 向 Angular 客户端发送注销消息?
- javascript - 如何使用来自浏览器的证书私钥对字符串进行签名?
- pycharm - Jupyter 在 Pycharm 中的 shift+tab 行为?
- html - 同名但大小写不同的网站目录
- apache-kafka - Kafka API CommitFailed 异常语义
- angular - Angular 7:使用 datalist 更改输入方法
- swift - 使用大量 if else 语句的更有效方式
- ios - 每当我在里面点击我的整个应用程序时播放点击声音