5

我正在为 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

4 回答 4

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这样它就不是那么手动了。

于 2012-07-07T23:26:12.313 回答
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)-edgrep将为您提供“newNames”向量的正确位置。我想如果你将它构建到一个函数中,你可能想确保有一组完整的匹配。

于 2012-07-06T19:12:42.203 回答
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))]
于 2012-07-06T18:17:43.033 回答
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)
于 2012-07-06T19:15:34.703 回答