如何在R中的相应查找表中用字符串替换data.frame列名

gh0*_*r18 8 r

我有以下data.frame:

set.seed(126)
df <- data.frame(a=sample(c(1:100, NA), 10), b=sample(1:100, 10), c=sample(1:100, 10), d = c(1:10))
    a  b  c  d
1  18 27 53  1
2  44 16 66  2
3  58 47  3  3
...
Run Code Online (Sandbox Code Playgroud)

以下查找表:

varnames <- data.frame(old = c("a", "b", "c"), new = c("dog", "cat", "mouse"))
  old   new
1   a   dog
2   b   cat
3   c mouse
Run Code Online (Sandbox Code Playgroud)

我想要做的是替换names(df)相应的varnames$new...如果a names(df)不在varnames$old,则保留在df中的colname ...

我想要返回的结果data.frame看起来像这样:

   dog cat mouse  d
1   57  10    83  1
2   53  99    94  2
3   99  60    39  3
...
Run Code Online (Sandbox Code Playgroud)

任何和所有帮助表示赞赏.

MrF*_*ick 11

如何使用该match()功能

mm <- match(names(df), varnames$old)
names(df)[!is.na(mm)] <- as.character(varnames$new[na.omit(mm)])
head(df)
#   dog cat mouse d
# 1  65  48    19 1
# 2  46  15    80 2
# 3  NA  47    84 3
# 4  68  34    46 4
# 5  23  75    42 5
# 6  92  87    68 6
Run Code Online (Sandbox Code Playgroud)

如果您有兴趣,也可以使用该dplyr rename()功能

library(dplyr)
df %>% rename_(.dots=with(varnames, setNames(as.list(as.character(old)), new)))
Run Code Online (Sandbox Code Playgroud)

或者另外一个选项,data.table包有一个setnames功能

library(data.table)
setnames(df, as.character(varnames$old), as.character(varnames$new))
Run Code Online (Sandbox Code Playgroud)