我正在为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)
有没有人有解决方案,我可以搜索列名并按顺序替换它们?
答案 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)