【问题标题】:R renaming passed columns in functionsR重命名函数中传递的列
【发布时间】:2023-03-28 13:30:03
【问题描述】:

我一直在搜索这个并发现this link 有助于从函数重命名传递的列([,column_name] 代码实际上使 my_function1 在我搜索了一段时间后工作。有没有办法使用管道运算符重命名函数内数据框中的列?

我的尝试显示在my_function2 中,但它给了我Error: All arguments to rename must be namedError: Unknown variables: col2。我猜是因为我没有指定col2 属于什么。

另外,有没有办法将关联的参数传递给函数,例如 col1 和 new_col1,以便您可以关联要替换的列名和替换它的列名。提前致谢!

library(dplyr)

my_df = data.frame(a = c(1,2,3), b = c(4,5,6), c = c(7,8,9))

my_function1 = function(input_df, col1, new_col1) {
  df_new = input_df
  df_new[,new_col1] = df_new[,col1]
  return(df_new)
}
temp1 = my_function1(my_df, "a", "new_a")

my_function2 = function(input_df, col2, new_col2) {
  df_new = input_df %>%
    rename(new_col2 = col2)
  return(df_new)
}

temp2 = my_function2(my_df, "b", "new_b")

【问题讨论】:

  • 查看rename_ 帮助文件中的?rename。这似乎有效:my_function3 = function(input_df, cols, new_cols) { rename_(input_df, .dots = setNames(as.list(cols), new_cols)) } 您可能会发现此链接有帮助:stackoverflow.com/q/30382908/1191259
  • @Frank 这行得通!我需要调查这些论点的实际含义以及为什么会这样。如果您将此作为答案发布(并请扩展解释,我们将不胜感激!)我会将其标记为答案。
  • @Frank 我假设相同的方法适用于select_,因为这就是?rename 中出现的方法。我还将改变列(这不在原始问题中,因为我想将其保留为一个问题),但我认为我可能遗漏了一些关于如何处理数据框中传递的列变量的基本知识?谢谢。
  • 一般来说,data.frame 在基础 R 中比在 dplyr 中更容易使用。我正在写我所知道的,但是使用该包进行编程时语法很快就会变得混乱。

标签: r function dplyr


【解决方案1】:

rename_(与其他带有下划线后缀的 dyplyr 动词一起)已被贬值。 相反,请尝试:

my_function3 = function(input_df, cols, new_cols) { 
  input_df %>%
    rename({{ new_cols }} := {{ cols }}) 
}

请参阅this vignette,了解有关使用双括号包含参数和使用 dplyr 编程的更多信息。

【讨论】:

  • 这是目前最合适的方法。不过,重命名函数的末尾有一个额外的括号。
【解决方案2】:

按照@MatthewPlourde's answer to a similar question,我们可以这样做:

my_function3 = function(input_df, cols, new_cols) { 
  rename_(input_df, .dots = setNames(cols, new_cols)) 
}

# example
my_function3(my_df, "b", "new_b")
#   a new_b c
# 1 1     4 7
# 2 2     5 8
# 3 3     6 9

许多 dplyr 函数都有名称以_ 结尾的鲜为人知的变体。这允许您以更编程的方式使用包。一种模式是...

DF %>% dplyr_fun(arg1 = val1, arg2 = val2, ...)
# becomes
DF %>% dplyr_fun_(.dots = list(arg1 = "val1", arg2 = "val2", ...))

这在少数情况下对我有用,其中 val* 只是列名。还有更复杂的模式和技巧,在你输入vignette("nse")时弹出的文档里有介绍,不过我不是很了解。

【讨论】:

  • 不请自来的建议:试试 data.table 包,它的语法更自然:setnames(DT, newnames)setnames(DT,oldnames,newnames)。它有一个学习曲线,但我发现它更容易使用。介绍材料在这里:github.com/Rdatatable/data.table/wiki/Getting-started
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
相关资源
最近更新 更多