我有以下包含名为列的数据框列表 cyl
# Create 3 dataframes with identical column names
mt_list <- list(head(mtcars[, 1:2]), tail(mtcars[, 1:2]), mtcars[13:18, 1:2])
mt_list
#> [[1]]
#> mpg cyl
#> Mazda RX4 21.0 6
#> Mazda RX4 Wag 21.0 6
#> Datsun 710 22.8 4
#> Hornet 4 Drive 21.4 6
#> Hornet Sportabout 18.7 8
#> Valiant 18.1 6
#>
#> [[2]]
#> mpg cyl
#> Porsche 914-2 26.0 4
#> Lotus Europa 30.4 4
#> Ford Pantera L 15.8 8
#> Ferrari Dino 19.7 6
#> Maserati Bora 15.0 8
#> Volvo 142E 21.4 4
#>
#> [[3]]
#> mpg cyl
#> Merc 450SL 17.3 8
#> Merc 450SLC 15.2 8
#> Cadillac Fleetwood 10.4 8
#> Lincoln Continental 10.4 8
#> Chrysler Imperial 14.7 8
#> Fiat 128 32.4 4
# New 'cyl' column names to change to (they are a character vector)
new_cyl_names <- c("cyl1", "cyl2", "cyl3")
new_cyl_names
#> [1] "cyl1" "cyl2" "cyl3"
Run Code Online (Sandbox Code Playgroud)
我想将其命名cyl为字符向量中的对应值new_cyl_names.
我尝试按如下方式执行此操作:
# Custom function to change cyl to the
# character value contained in new_colname
change_colname_cyl <- function(df, new_colname){
df %>%
dplyr::rename(new_colname = cyl)
}
# The following should change the names to cyl1, cyl2, cyl3
purrr::map2(.x = mt_list, .y = new_cyl_names, ~ change_colname_cyl(.x, .y))
Run Code Online (Sandbox Code Playgroud)
这导致(仅显示第一个数据帧):
[[1]]
mpg new_colname
Mazda RX4 21.0 6
Mazda RX4 Wag 21.0 6
Datsun 710 22.8 4
Hornet 4 Drive 21.4 6
Hornet Sportabout 18.7 8
Valiant 18.1 6
Run Code Online (Sandbox Code Playgroud)
谁能帮我用purrr正确的这个变化,即cyl对cyl1在这种情况下,而不是new_colname按照上面?
我对你的功能稍作修改.我认为现在它有效.请参阅此(https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html)以了解有关标准评估和非标准评估的更多信息dplyr.
library(tidyverse)
# List of data frames
mt_list <- list(head(mtcars[, 1:2]), tail(mtcars[, 1:2]), mtcars[13:18, 1:2])
# New column names
new_cyl_names <- c("cyl1", "cyl2", "cyl3")
# Create the function
change_colname_cyl <- function(df, new_colname){
df %>% rename(!!new_colname := cyl)
}
# Apply the function
map2(mt_list, new_cyl_names, ~ change_colname_cyl(.x, .y))
[[1]]
mpg cyl1
Mazda RX4 21.0 6
Mazda RX4 Wag 21.0 6
Datsun 710 22.8 4
Hornet 4 Drive 21.4 6
Hornet Sportabout 18.7 8
Valiant 18.1 6
[[2]]
mpg cyl2
Porsche 914-2 26.0 4
Lotus Europa 30.4 4
Ford Pantera L 15.8 8
Ferrari Dino 19.7 6
Maserati Bora 15.0 8
Volvo 142E 21.4 4
[[3]]
mpg cyl3
Merc 450SL 17.3 8
Merc 450SLC 15.2 8
Cadillac Fleetwood 10.4 8
Lincoln Continental 10.4 8
Chrysler Imperial 14.7 8
Fiat 128 32.4 4
Run Code Online (Sandbox Code Playgroud)
根据保罗的评论.以下似乎是重命名列的更直接和简洁的方法.
map2(mt_list, new_cyl_names, ~rename(.x, !!.y := cyl))
Run Code Online (Sandbox Code Playgroud)