首页 > 解决方案 > 如何使用 R(tidyverse)中的新旧名称表重命名表中的列?

问题描述

我有一个包含列名称的表,我想根据一个包含当前名称列和替换名称列的表来更改它。

举个例子:

library(tidyverse)
name_tbl <- enframe(names(mtcars), value = "old_names") %>% 
  rowwise() %>% 
  mutate(new_names = paste0(old_names, sample(50:100, 1)))

name_tbl
#> # A tibble: 11 x 3
#> # Rowwise: 
#>     name old_names new_names
#>    <int> <chr>     <chr>    
#>  1     1 mpg       mpg79    
#>  2     2 cyl       cyl57    
#>  3     3 disp      disp70   
#>  4     4 hp        hp57     
#>  5     5 drat      drat72   
#>  6     6 wt        wt88     
#>  7     7 qsec      qsec86   
#>  8     8 vs        vs66     
#>  9     9 am        am91     
#> 10    10 gear      gear71   
#> 11    11 carb      carb50

在这一点上,我希望能够执行以下操作:

mtcars %>% rename(name_tbl$old_names = name_tbl$new_names)

但是它当然不起作用,因为 rename 需要命名参数。

我已经查看了所有内容,但没有找到执行此操作的 tidyverse 方法。有没有办法使用这样的查找表重命名列?

目前,我在所有内容上旋转了更长的时间,然后 left_joining 键表,但是这是有问题的,因为必须首先将所有列转换为相同的类型,这不容易撤消。

标签: rdplyr

解决方案


我们, ' name_tbl ungroup' 并创建一个命名向量或list使用inside来更改列名!!!rename

library(dplyr)
library(tibble)
v1 <- name_tbl %>% 
       ungroup %>%
       select(new_names, old_names) %>%
       deframe
mtcars %>% 
  rename(!!! v1)

-输出

#                   mpg82 cyl96 disp93 hp94 drat74  wt58 qsec53 vs70 am79 gear81 carb83
#Mazda RX4          21.0     6    160  110   3.90 2.620  16.46    0    1      4      4
#Mazda RX4 Wag      21.0     6    160  110   3.90 2.875  17.02    0    1      4      4
#Datsun 710         22.8     4    108   93   3.85 2.320  18.61    1    1      4      1
#Hornet 4 Drive     21.4     6    258  110   3.08 3.215  19.44    1    0      3      1
#Hornet Sportabout  18.7     8    360  175   3.15 3.440  17.02    0    0      3      2
#Valiant            18.1     6    225  105   2.76 3.460  20.22    1    0      3      1
# ...

推荐阅读