【问题标题】:Rename multiple dataframe columns using purrr使用 purrr 重命名多个数据框列
【发布时间】:2018-03-18 21:37:02
【问题描述】:

我有以下数据框列表,其中包含一个名为 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"

我想将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))

这会导致(仅显示第一个数据框):

[[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

谁能帮我正确使用purrr,即在这种情况下将cyl更改为cyl1,而不是上面的new_colname

【问题讨论】:

    标签: r tidyverse purrr


    【解决方案1】:

    我对你的函数做了一点修改。我认为现在它有效。请参阅此 (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
    

    更新

    基于 Paul 的 cmets。以下似乎是重命名列的更直接和简洁的方法。

    map2(mt_list, new_cyl_names, ~rename(.x, !!.y := cyl))
    

    【讨论】:

    • 需要quo_name 吗?看起来map2(mt_list, new_cyl_names, ~rename(.x, !!.y := cyl)) 做了同样的事情。
    • @Paul 感谢您的评论。在这种情况下确实不需要quo_name。我已根据您的建议更新了我的帖子。
    • @ycw。感谢您的回复-尽管当我运行您的代码时,它给出了Error: All arguments to rename() must be named.。它会给你一个类似的错误吗?还有一点,ibrary(tidyverse) 应该改为library(tidyverse)。 @Paul 的简洁解决方案也对我产生了同样的错误
    • @user4687531 感谢您指出错字。我已经解决了。不,我没有这个错误。请确保您使用的是最新版本的tidyverse
    • 啊,我不得不自己手动更新dplyr。出于某种原因,执行install.packages("tidyverse")update.packages("tidyverse")library(tidyverse) 并重新启动R 没有更新dplyr。我是否在上面错误地更新了dplyr?顺便说一句 - 我接受你的解决方案:)
    【解决方案2】:

    我们可以使用data.table中的setnames

    library(data.table)
    library(tidyverse)
    map2(mt_list, new_cyl_names, ~setnames(.x, 'cyl', .y))
    mt_list
    #[[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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-09
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 2021-02-09
      • 2017-11-06
      • 1970-01-01
      相关资源
      最近更新 更多