【问题标题】:Create variable based on other variable outside function基于函数外的其他变量创建变量
【发布时间】:2021-02-09 17:52:03
【问题描述】:

我正在尝试使我的代码通用,我只想更改 YEAR 变量而不必更改代码中的所有内容

YEAR = 1970

y <- data.frame(col1 = c(1:5))

function (y){
  summarize(column_YEAR = sum(col1))
}
#Right now this gives
  column_YEAR
1          15

#I would like this function to output this (so col1 is changed to column_1970)
  column_1970
1          15

或者例如这个

df <- list("a_YEAR" = anotherdf)
#I would like to have a list with a df with the name a_1970

我尝试过类似

df <- list(assign(paste0(a_, YEAR), anotherdf))

但它不起作用,有人有什么建议吗?在此先感谢:)

【问题讨论】:

  • 您的输入是什么样的,您希望您的输出是什么样的?
  • @D.J 编辑了我的问题

标签: r data-manipulation data-cleaning


【解决方案1】:

rlangdefuse R expressions 提供了一种灵活的方式。您可以使用该功能在dplyr 流中创建动态列名。在此示例中,动态列名称是使用 suffix 参数创建的,该参数传递给 dplyr 的摘要上的包装函数。

library("tidyverse")

YEAR = 1970

y <- data.frame(col1 = c(1:5))

function (y) {
  summarize(column_YEAR = sum(col1))
}

my_summarise <- function(.data, suffix, sum_col) {
  var_name <- paste0("column_", suffix)
  
  summarise(.data,
            {{var_name}} := sum({{sum_col}}))
}

my_summarise(.data = y, suffix = YEAR, sum_col = col1)

结果

my_summarise(.data = y, suffix = YEAR, sum_col = col1)
#   column_1970
# 1          15

您也可以直接从全局环境中获取参数,但从可读性的角度来看,这是一个较差的解决方案,因为目前尚不清楚函数如何创建后缀。

my_summarise_two <- function(.data, sum_col) {
    
    var_name <- paste0("column_", YEAR)
    
    summarise(.data,
              {{var_name}} := sum({{sum_col}}))
}

my_summarise_two(.data = y, sum_col = col1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-10
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多