R重命名函数

时间:2016-01-26 20:31:26

标签: r function dplyr

我一直在搜索这个,并且发现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")

2 个答案:

答案 0 :(得分:2)

rename_(以及带有下划线后缀的其他dyplyr动词)已被弃用。 相反,请尝试:

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

有关使用双括号拥抱参数和dplyr编程的更多信息,请参见this vignette

答案 1 :(得分:1)

关注@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")时弹出的文档中包含更复杂的模式和技术,但我对它们并不了解。