我有来自 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))