如何使用动态名称和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