r - 如何使用 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 键表,但是这是有问题的,因为必须首先将所有列转换为相同的类型,这不容易撤消。
解决方案
我们, ' 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
# ...