我有来自ACS Census的数据,该数据具有元数据和带有编码列名的表,我需要将列名更改为元数据中的列名,以便在读取时有意义。有没有一种方法可以通过将表与元数据链接来将编码的列名替换为实际的列名。
我已经使用dplyr包一一重命名该列,但是我无法对每个表都进行重命名,因为单个表(数据框)有32000列
任何帮助将不胜感激,谢谢。
答案 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
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))