有没有办法使用另一个具有原始和新列名的表重命名 r 中数据帧的列?



我有来自 ACS 人口普查的数据,其中包含元数据和带有编码列名的表,我需要将列名更改为元数据中的列名,以便在读取时有意义。有没有办法通过将表与元数据链接来将编码的列名替换为实际名称。

我已经使用 dplyr 包逐个重命名列,但我不能为每个表执行此操作,因为单个表(数据帧(大约有 32000 列

任何帮助将不胜感激,谢谢。

我们可以使用rename并计算命名向量

library(dplyr)
df2 <- rename(df2, !!! set_names(df1$original, df1$new))
df2
#  A  B  C
#1 1  6 11
#2 2  7 12
#3 3  8 13
#4 4  9 14
#5 5 10 15

数据

df1 <-data.frame(original  = c('a', 'b', 'c'), new = c('A', 'B', 'C'),
stringsAsFactors = FALSE)
df2 <- data.frame(a = 1:5, b =6:10, c = 11:15)

如果准引用不方便,可以用向量覆盖现有名称。 从一个微不足道的例子开始 -dplyr中的band_instruments

library(dplyr)
foo <- band_instruments
foo
# A tibble: 3 x 2
name  plays 
<chr> <chr> 
1 John  guitar
2 Paul  bass  
3 Keith guitar

使用字符向量覆盖

names(foo) <- c("Moniker", "Jams.On")
R > foo
# A tibble: 3 x 2
Moniker Jams.On
<chr>   <chr>  
1 John    guitar 
2 Paul    bass   
3 Keith   guitar 

因此,如果您有一个翻译表,即使是包含一些额外信息的表:

foo <- band_instruments
trTbl <- tibble(Names.Now = c("plays", "name", "shoes"),
Names.Desired = c("Jams.On", "Moniker", "boots"))
replaceVec  <-  tibble(Names.Now =  names(band_instruments)) %>% 
left_join(trTbl, by = "Names.Now") %>% 
pull(Names.Desired)
names(foo) <- replaceVec
foo
# A tibble: 3 x 2
Moniker Jams.On
<chr>   <chr>  
1 John    guitar 
2 Paul    bass   
3 Keith   guitar 

你可以使用好的老match方法。

dat  ## before
#   X1 X4 X3 X2
# 1  1  4  7 10
# 2  2  5  8 11
# 3  3  6  9 12
names(dat) <- am$label[match(names(dat), am$code)]
dat  ## after
#   wage hh.size age no.children
# 1    1       4   7          10
# 2    2       5   8          11
# 3    3       6   9          12

数据:

dat <- structure(list(X1=1:3, X2=4:6, X3=7:9, X4=10:12), class="data.frame", 
row.names=c(NA, -3L))
am <- structure(list(code=c("X1", "X2", "X3", "X4"), 
label=c("age", "wage", "no.children", "hh.size")), 
class="data.frame", row.names=c(NA, -4L))

最新更新