【问题标题】:Rename all dataframe columns after dropping some within chained pipes [duplicate]在链接管道中删除一些后重命名所有数据框列[重复]
【发布时间】:2019-11-08 11:50:27
【问题描述】:

我有一个数据框,我过滤、删除和添加一些列,然后我想重命名所有列,全部使用管道 (%>%)。

但是,我不明白如何获取当前的 colnames 向量(在%>% 内)并将其替换为另一个向量?如果我不删除列,这似乎很容易,但是如何在管道链中“更新”colnames 的向量?

library(dplyr)
library(tidyr)

data("mtcars")

mtcars %>% 
  filter(disp < 200) %>% 
   dplyr::select(-c('mpg','cyl', "disp")) %>%
   mutate(Type = 2)  %>% 
  # rename_at(vars(names(df),              # how to rename the columns??? 
   #          function(x) paste(names(df), "new", sep = "_"))) %>% 
   head(2)

我得到了什么:

   hp drat    wt  qsec vs am gear carb Type
1 110  3.9 2.620 16.46  0  1    4    4    2
2 110  3.9 2.875 17.02  0  1    4    4    2

我的期望(更改了列名)

hp_new drat_new    wt_new  qsec_new vs_new am_new gear_new carb_new Type_new
1 110     3.9      2.620   16.46     0      1      4        4         2
2 110     3.9      2.875   17.02     0      1      4        4         2

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用rename_all

    library(dplyr)
    
    mtcars %>% 
      filter(disp < 200) %>% 
      dplyr::select(-c('mpg','cyl', "disp")) %>%
      mutate(Type = 2)  %>%
      rename_all(~paste0(., "_new")) %>% head
    
    #  hp_new drat_new wt_new qsec_new vs_new am_new gear_new carb_new Type_new
    #1    110     3.90  2.620    16.46      0      1        4        4        2
    #2    110     3.90  2.875    17.02      0      1        4        4        2
    #3     93     3.85  2.320    18.61      1      1        4        1        2
    #4     62     3.69  3.190    20.00      1      0        4        2        2
    #5     95     3.92  3.150    22.90      1      0        4        2        2
    #6    123     3.92  3.440    18.30      1      0        4        4        2
    

    【讨论】:

    • 另一个问题,几秒钟前的另一个案例:D
    • @Sotos 我猜,我们无法逃避这一点。 :D
    【解决方案2】:

    我们可以使用rename_allstr_c(tidyverse 方法)

    library(dplyr)
    library(stringr)
    
    mtcars %>% 
      filter(disp < 200) %>% 
      dplyr::select(-c('mpg','cyl', "disp")) %>%
      mutate(Type = 2)  %>% 
      rename_all(~ str_c(., "_new")) %>%
      head(2)
    #  hp_new drat_new wt_new qsec_new vs_new am_new gear_new carb_new Type_new
    #1    110      3.9  2.620    16.46      0      1        4        4        2
    #2    110      3.9  2.875    17.02      0      1        4        4        2
    

    或者另一个选项是set_names

    mtcars %>% 
      filter(disp < 200) %>% 
      dplyr::select(-c('mpg','cyl', "disp")) %>% 
      mutate(Type = 2)  %>% 
      set_names(str_c(names(.), "_new"))
    

    或使用base R

    nm1 <-  setdiff(names(mtcars), c("mpg", "cyl", "disp"))
    setNames(subset(mtcars, disp < 200, select = nm1), paste0(nm1, "_new"))
    

    【讨论】:

      猜你喜欢
      • 2018-04-29
      • 2017-10-14
      • 2019-02-04
      • 2012-07-18
      • 2021-05-14
      • 2022-10-23
      • 1970-01-01
      • 2019-10-02
      • 2020-08-30
      相关资源
      最近更新 更多