首页 > 解决方案 > 具有未知长度变量列表的 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 周,所以如果有人能给我一些关于我需要在这里做什么的指示,那就太好了。谢谢!

标签: r

解决方案


如果 'var1', 'var2', 'var3', 'var4' 是列名的向量(作为 'variables' 中的字符串,那么我们可以转换为symbol 并评估 ( !!)

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)
  }
         

推荐阅读