重命名数据框中的几列:为什么不使用%in%运算符保留顺序?

Nat*_*nos 4 r

这是参考这个问题.

我想重命名一个大数据框中的列子集.我希望下面的代码来重命名列X4,X5,X6X7gradek,grade1,grade2,和grade3分别为:

set.seed(1)
in.df <- data.frame( matrix( rnorm(60), ncol=10) )
names(in.df) <- ifelse( names(in.df) %in% c('X4', 'X5', 'X6', 'X7'),
                         paste('grade', c('k',1:3), sep=''),
                         names(in.df) )
Run Code Online (Sandbox Code Playgroud)

然而,

> names(in.df)
 [1] "X1"     "X2"     "X3"     "grade3" "gradek" "grade1" "grade2" "X8"    
 [9] "X9"     "X10"   
Run Code Online (Sandbox Code Playgroud)

即使

> paste('grade', c('k',1:3), sep='')
[1] "gradek" "grade1" "grade2" "grade3"
Run Code Online (Sandbox Code Playgroud)

显示订单未保留.这个线程,建议使用match而不是%in%工作,但在这种情况下它不会.(也许在其他版本的R中也是如此.在我安装的版本(2.15.3)中,帮助页面match建议%in%通过match这样定义,因此将其切换起来没有任何帮助.)

任何帮助,将不胜感激!

接受的答案 这个答案修复了我的重命名问题. 这个答案解释了奇怪的行为是由于回收.

A5C*_*2T1 5

%in%应该工作,但也许match更好.

考虑以下."A"和"B"代表你的names(in.df).我们希望使用结果以该顺序替换"matchme" 的值paste('grade', c('k',1:3), sep='').

比较不同的输出:

A <- B <- c("X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10")
matchme <- c('X4', 'X7', 'X6', 'X5')
A[A %in% matchme] <- paste('grade', c('k',1:3), sep='')
A
#  [1] "X1"     "X2"     "X3"     "gradek" "grade1" "grade2" "grade3" "X8"    
#  [9] "X9"     "X10"  
B[match(matchme, B)] <- paste('grade', c('k',1:3), sep='')
B
#  [1] "X1"     "X2"     "X3"     "gradek" "grade3" "grade2" "grade1" "X8"    
#  [9] "X9"     "X10"   
Run Code Online (Sandbox Code Playgroud)