如何使用动态名称和dplyr重命名变量?

如何使用动态名称和dplyr重命名变量?,r,dplyr,nse,R,Dplyr,Nse,我想重命名函数中的一列,该列的名称作为该函数的参数传递。基本上,我有一个函数 produce_data_frame <- function(name) { return(iris) } 我想用名为newName的Sepal.Length列返回iris data.frame。但我对NSE的理解仍然非常基本,甚至还没有编译。你可以使用基本的R名称 你可以试试 图书馆管理员 生成\u数据\u帧% as.tible%>% 选择quo_name:=萼片长度 } 生成\u数据\u框架新\u名称

我想重命名函数中的一列,该列的名称作为该函数的参数传递。基本上,我有一个函数

produce_data_frame <- function(name) {
  return(iris)
}
我想用名为newName的Sepal.Length列返回iris data.frame。但我对NSE的理解仍然非常基本,甚至还没有编译。

你可以使用基本的R名称

你可以试试

图书馆管理员 生成\u数据\u帧% as.tible%>% 选择quo_name:=萼片长度 } 生成\u数据\u框架新\u名称 >一个tibble:150x1 >新名称 > > 1 5.10 > 2 4.90 > 3 4.70 > 4 4.60 > 5 5.00 > 6 5.40 > 7 4.60 > 8 5.00 > 9 4.40 > 10 4.90 > ... 还有140多行 由v0.2.0于2018年4月4日创建。

在dplyr渐晕图编程中,我们可以使用:=运算符:

library(dplyr)
library(rlang)


produce_data_frame <- function(name) {
  name = quo_name(name)
  iris %>%
    rename(!!name := Sepal.Length)
}

produce_data_frame('test') %>% colnames()
#> [1] "test"         "Sepal.Width"  "Petal.Length" "Petal.Width" 
#> [5] "Species"
使用dplyr::rename和glue,几乎不需要编写这样的函数,因为您始终可以执行以下操作:

library(glue)
library(dplyr)
name <- "new_name"
rename(iris,"{name}" := Sepal.Length)
如果需要一个函数,有很多方法可以实现它。以下是重命名包含数据帧的命名向量或列表的通用函数:

rename_named_obj <- function(named_obj,new_names) {
  setNames(named_obj,
    purrr::map2_chr(names(named_obj),
                    names(new_names)[match(names(named_obj),new_names)],
      ~ {
        ifelse(is.na(.y),.x,.y)
      })
  )
}
给出以下结果:

> new_iris_names <- list("new_name1"="Sepal.Length","new_name2"="Petal.Length")
> rename_named_obj(iris,new_iris_names) %>% colnames()
[1] "new_name1"   "Sepal.Width" "new_name2"   "Petal.Width" "Species"    
> rename_named_obj(setNames(1:5,colnames(df)),new_iris_names)
  new_name1 Sepal.Width   new_name2 Petal.Width     Species 
          1           2           3           4           5 

不确定我的问题出了什么问题,我试着发展我的例子,如果这不是问题,有人能解释一下问题出在哪里吗?谢谢
library(glue)
library(dplyr)
name <- "new_name"
rename(iris,"{name}" := Sepal.Length)
rename_named_obj <- function(named_obj,new_names) {
  setNames(named_obj,
    purrr::map2_chr(names(named_obj),
                    names(new_names)[match(names(named_obj),new_names)],
      ~ {
        ifelse(is.na(.y),.x,.y)
      })
  )
}
> new_iris_names <- list("new_name1"="Sepal.Length","new_name2"="Petal.Length")
> rename_named_obj(iris,new_iris_names) %>% colnames()
[1] "new_name1"   "Sepal.Width" "new_name2"   "Petal.Width" "Species"    
> rename_named_obj(setNames(1:5,colnames(df)),new_iris_names)
  new_name1 Sepal.Width   new_name2 Petal.Width     Species 
          1           2           3           4           5