如何修改R语言函数实现将列名改为传入的变量名?
问题分析
你的函数里,col1参数虽然接收了字符串"hello_world",但在expand_grid里你直接写死了col1 = iris$Species,这相当于把列名固定成了col1,完全没用到传入的参数值,所以自然不会改列名。
修改方案
方法1:创建时直接动态指定列名(tidyverse风格)
利用tidyverse的非标准求值语法!!和:=,在创建数据框时直接把传入的参数作为列名:
change_name <- function(col1){ tidyr::expand_grid(!!col1 := iris$Species, col2 = iris$Sepal.Length) } # 调用测试 change_name(col1="hello_world")
这里!!col1会把参数col1的字符串值解引用,:=用来实现动态命名,这样生成的第一列就会是你指定的名称。
方法2:先创建再重命名(base R风格)
如果不想用tidyverse的特殊语法,也可以用base R的列名修改方式:
change_name <- function(col1){ df <- tidyr::expand_grid(col1 = iris$Species, col2 = iris$Sepal.Length) # 找到原col1的位置,替换成指定名称 names(df)[names(df) == "col1"] <- col1 df } # 调用测试 change_name(col1="hello_world")
这种方法更直观,先生成固定列名的数据框,再通过修改names(df)来替换列名。
方法3:用dplyr重命名(tidyverse风格)
如果习惯用dplyr的函数,也可以先创建数据框,再用rename函数动态重命名:
change_name <- function(col1){ tidyr::expand_grid(col1 = iris$Species, col2 = iris$Sepal.Length) %>% dplyr::rename(!!col1 := col1) } # 调用测试 change_name(col1="hello_world")
和方法1原理类似,都是用!!解引用参数值来实现动态命名。
内容的提问来源于stack exchange,提问作者Basil
相关产品推荐
相关产品推荐

