r - 具有未知长度变量列表的 R 函数
问题描述
尝试扩展学习一些 R,我在工作中经常做的一件事是我通过某个特定时间段的变量来拉加权平均值。我想出了如何像这样单独做到这一点:
means_by_period <- df %>%
group_by(period) %>%
summarize(var1 = weighted.mean(var1, wgtvar),
var2 = weighted.mean(var2, wgtvar),
var3 = weighted.mean(var3, wgtvar),
var4 = weighted.mean(var4, wgtvar)
)
我们一直这样做,但我并不总是知道我将要提取多少变量/哪些变量,每次编辑这段代码都会很痛苦,所以我建立了一个 Excel 表来为我做这件事,但这似乎是一个学习如何编写函数来完成它的好机会。问题是我不确定如何编写它以使其正常工作。我知道我的论点将是: 1. 当前数据集 2. 周期 3. 加权变量 4. 我的变量的串联向量?
newfunction <- function(df, period, weight, variables)
{df %>%
group_by(period) %>%
summarize(var1 = weighted.mean(var1, weight),
var2 = weighted.mean(var2, weight),
var3 = weighted.mean(var3, weight),
var4 = weighted.mean(var4, weight) )
}
我已经学习了 2 周,所以如果有人能给我一些关于我需要在这里做什么的指示,那就太好了。谢谢!
解决方案
如果 'var1', 'var2', 'var3', 'var4' 是列名的向量(作为 'variables' 中的字符串,那么我们可以转换为sym
bol 并评估 ( !!
)
library(dplyr)
newfunction <- function(df, period, weight, variables) {
df %>%
group_by({{period}}) %>%
summarize(
!! variables[1] := weighted.mean( !! rlang::sym(variables[1]), {{weight}}),
!! variables[2] := weighted.mean( !! rlang::sym(variables[2]), {{weight}}),
!! variables[3] := weighted.mean( !! rlang::sym(variables[3]), {{weight}}),
!! variables[4] := weighted.mean( !! rlang::sym(variables[4]), {{weight}}) )
}
这里,'period'、'weight' 的列名被假定为不带引号传递,而 'variables' 作为字符串向量
正如 OP 提到的“变量”可以是未知长度,我们可以遍历列名(“变量”)的向量map
library(purrr)
newfunction2 <- function(df, period, weight, variables) {
map(variables, ~ df %>%
group_by({{period}}) %>%
summarise(!! .x := weighted.mean(!! rlang::sym(.x), {{weight}}))) %>%
reduce(full_join)
}
推荐阅读
- android - 我有一个已发布的应用程序,如果 APK 是通过 xender 或任何其他资源发送/安装的,它是否计入 Google Play 商店?
- python - Django 的 manage.py 显示旧命令
- python - 如何使用 CreateSession 启动 pbap 会话
- python - 在 Jupyter Notebook 中显示 Pandas DataFrame
- c++ - 'reinterpret_cast':无法使用 boost.dll 从 'overloaded-function' 转换为 'intptr_t'
- java - Querydsl InnerJoin DTO
- maple - 如何在 GR-tensor 包中使用系列?
- python - 在我的 jupyter 笔记本中安装fuzzywuzzy 库时出错
- microsoft-translator - 自定义翻译 API 授权
- c# - c# SOAP web service 复杂类型