R重命名函数中传递的列

Pre*_*ost 5 r function dplyr

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

我的尝试显示在,my_function2但它给了我一个Error: All arguments to rename must be namedor Error: 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")
Run Code Online (Sandbox Code Playgroud)

4re*_*ood 5

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

my_function3 = function(input_df, cols, new_cols) { 
  input_df %>%
    rename({{ new_cols }} := {{ cols }}) 
}
Run Code Online (Sandbox Code Playgroud)

有关使用双大括号包含参数和使用 dplyr 进行编程的更多信息,请参阅此小插图


Fra*_*ank 3

根据@MatthewPlourde 对类似问题的回答,我们可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

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

DF %>% dplyr_fun(arg1 = val1, arg2 = val2, ...)
# becomes
DF %>% dplyr_fun_(.dots = list(arg1 = "val1", arg2 = "val2", ...))
Run Code Online (Sandbox Code Playgroud)

这在某些情况下对我有用,其中val*只是列名称。还有更复杂的模式和技术,在您键入时弹出的文档中有所介绍vignette("nse"),但我不太了解它们。