更改列顺序
问题描述:
我正在处理大于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)
如何将我列前柱“标贴”移动到“A”,而无需编写所有其他列名(即我可以只指定一列来前/另一列后? )。
谢谢。
答
东西快速和肮脏的将是(即没有健全检查等,并只承担单一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
这应该提出一个方法来处理这种事情,如果你需要更多的灵活性。
答
解额外的灵活性:
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)])
}