更改列的顺序

时间:2012-03-20 13:45:26

标签: r

我正在处理一个包含> 40列的大型数据框。我希望能够移动列,而无需指定所有列名称。例如:

a<-c(1:5)  
b<-c(4,3,2,1,1)  
Percent<-c(40,30,20,10,10)
Labels<-c("Cat","Dog","Rabbit","Rat","Mouse")
df1<-data.frame(a,b,Percent,Labels)

如何将列'Lables'移动到列'a'之前,而不必写入所有其他列名称(即我可以在另一列之前/之后指定一列?)。

感谢。

2 个答案:

答案 0 :(得分:5)

快速和肮脏的东西(即没有健全性检查等,假设只提供一个colname):

moveToFirstCol <- function(df, colname) {
    cnams <- colnames(df)
    want <- which(colname == cnams)
    df[, c(cnams[want], cnams[-want])]
}

给出:

> moveToFirstCol(df1, "Labels")
  Labels a b Percent
1    Cat 1 4      40
2    Dog 2 3      30
3 Rabbit 3 2      20
4    Rat 4 1      10
5  Mouse 5 1      10

如果您需要额外的灵活性,这应该建议一种处理此类事情的方法。

答案 1 :(得分:1)

具有额外灵活性的解决方案:

move_variable <- function(x,where,data,after=FALSE){
 vnames <- names(data)
 x_idx <- match(x, vnames)
 where_idx <- match(where, vnames)
 idx <- seq(length(vnames))
 idx[x_idx] <- where_idx
 idx1 <- rep(0L, length(vnames))
 if(after) idx1[x_idx] <- 1 else idx1[where_idx] <- 1
 return(data[order(idx, idx1)])
}