通过搜索列名重命名数据框的列

时间:2012-07-06 18:07:45

标签: r

我正在为ggplot编写一个包装器,以根据各种数据集生成多个图形。当我将列名传递给函数时,我需要重命名列名,以便ggplot可以理解引用。

但是,我正在努力重命名数据框的列

这是一个数据框:

df <- data.frame(col1=1:3,col2=3:5,col3=6:8)

这是我的搜索列名:

col1_search <- "col1"
col2_search <- "col2"
col3_search <- "col3"

以下是要替换的列名:

col1_replace <- "new_col1"
col2_replace <- "new_col2"
col3_replace <- "new_col3"

当我搜索列名时,R对列索引进行排序并忽略搜索位置。

例如,当我运行以下代码时,我希望新标题为new_col1,new_col2和new_col3,而新列名称为:new_col3,new_col2和new_col1

colnames(df)[names(df) %in% c(col3_search,col2_search,col1_search)] <- c(col3_replace,col2_replace,col1_replace)

有没有人有解决方案,我可以搜索列名并按顺序替换它们?

4 个答案:

答案 0 :(得分:8)

require(plyr)
df <- data.frame(col2=1:3,col1=3:5,col3=6:8)
df <- rename(df, c("col1"="new_col1", "col2"="new_col2", "col3"="new_col3"))
df

你可以创造性地将第二个参数设为rename,这样就不会那么手动了。

答案 1 :(得分:4)

> names(df)[grep("^col", names(df))] <- 
                        paste("new", names(df)[grep("^col", names(df))], sep="_")
> names(df)
[1] "new_col1" "new_col2" "new_col3"

如果要用一个任意字符向量替换一组有序的列名,那么这应该有效:

names(df)[sapply(oldNames, grep, names(df) )] <- newNames

sapply() - ed grep会为您提供“newNames”向量的正确位置。我想如果你把它构建成一个函数,你可能想确保有一套完整的匹配。

答案 2 :(得分:2)

嗯,这可能是复杂的,但是第一个出现在我脑海中的是:

lookup <- data.frame(search = c(col3_search,col2_search,col1_search),
                     replace = c(col3_replace,col2_replace,col1_replace))

colnames(df) <- lookup$replace[match(lookup$search, colnames(df))]

答案 3 :(得分:1)

我的第二个@ justin的aes_string建议。但是对于将来的重命名,你可以试试。

require(stringr)
df <- data.frame(col1=1:3,col2=3:5,col3=6:8)
oldNames <- c("col1", "col2", "col3")
newNames <- c("new_col1", "new_col2", "new_col3")
names(df) <- str_replace(string=names(df), pattern=oldNames, replacement=newNames)