有没有一种方法可以使用另一个具有原始和新列名称的表来重命名r中数据框的列?

时间:2020-06-03 22:26:50

标签: r census

我有来自ACS Census的数据,该数据具有元数据和带有编码列名的表,我需要将列名更改为元数据中的列名,以便在读取时有意义。有没有一种方法可以通过将表与元数据链接来将编码的列名替换为实际的列名。

我已经使用dplyr包一一重命名该列,但是我无法对每个表都进行重命名,因为单个表(数据框)有32000列

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

3 个答案:

答案 0 :(得分:4)

我们可以使用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)

答案 1 :(得分:2)

如果准引号不方便,则可以使用矢量覆盖现有名称。从一个简单的示例开始-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 

答案 2 :(得分:2)

您可以使用良好的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))