2

正如Jared所建议的那样,我正在根据这个答案尝试优化 中的第二个参数。plyr:rename

简而言之,他们plyr正在使用这样的方式重命名数据框中的某些列,

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

require(plyr)
df <- rename(df, c("col1"="new_col1", "col2"="new_col2", "col3"="new_col3"))
df

顺便说一句, Jared写道:“你可以创造性地使第二个参数重命名,这样它就不会那么手动了。”

我试过像这样有创意,

df <- data.frame(col1=1:3,col2=3:5,col3=6:8)
df
secondArgument <- paste0('"', oldNames, '"','=', '"',newNames, '"',collapse = ',')
df <- rename(df, secondArgument)
df

但它不起作用,任何人都可以帮我自动化这个吗?

谢谢!

更新 9 月 9 日星期日晚上 11:55:42

我意识到我应该更具体地回答我的问题。

我正在使用plyr::rename,因为在我的现实生活示例中,我有其他变量,而且我并不总是知道要重命名的变量的位置。我将更新我的问题

我的案例看起来像这样,但有 100 多个变量

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

df2 <- data.frame(col1=1:3,col2=3:5,col3=6:8)
df2
newNames <- c("new_col1", "new_col3")
oldNames <- names(df[,c('col1', 'col3')])
secondArgument <- paste0('"', oldNames, '"','=', '"',newNames, '"',collapse = ',')
df2 <- rename(df2, secondArgument)
df2

如果有什么我需要澄清的,请添加评论。

4

3 回答 3

3

将名称设置为newNames来自的名称oldNames

R> names(newNames) <- oldNames
R> newNames
      col1       col2       col3 
"new_col1" "new_col2" "new_col3" 
R> df <- rename(df, newNames)
R> df
  new_col1 new_col2 new_col3
1        1        3        6
2        2        4        7
3        3        5        8
于 2012-09-09T21:26:37.050 回答
3

修改问题的解决方案:

df2 <- data.frame(col1=1:3,col2=3:5,col3=6:8)
df2
newNames <- c("new_col1", "new_col3")
oldNames <- names(df2[,c('col1', 'col3')]) 

(根据定义不oldNames等于?)c('col1','col3')

解决方案plyr

secondArgument <- setNames(newNames,oldNames)
library(plyr)
df2 <- rename(df2, secondArgument)
df2

或者在基础 R 中,你可以这样做:

names(df2)[match(oldNames,names(df2))] <- newNames
于 2012-09-09T23:22:21.013 回答
2

plyr::rename需要一个命名字符向量,新名称作为值,旧名称作为名称。

这应该有效:

names(newNames) <- oldNames
df <- rename(df, newNames)
df
  new_col1 new_col2 new_col3
1        1        3        6
2        2        4        7
3        3        5        8
于 2012-09-09T21:31:39.840 回答