我有以下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)
| 归档时间: |
|
| 查看次数: |
1828 次 |
| 最近记录: |