这是参考这个问题.
我想重命名一个大数据框中的列子集.我希望下面的代码来重命名列X4,X5,X6和X7以gradek,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这样定义,因此将其切换起来没有任何帮助.)
任何帮助,将不胜感激!
%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)