2012-03-20 5 views
2

Я работаю над большим фреймворком данных с> 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» раньше колонок «а» без необходимости писать все остальные имена столбцов (т.е. можно просто указать столбец прийти до/после другого столбца?).

Спасибо.

ответ

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

Решение дополнительную гибкость:

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)]) 
} 
Смежные вопросы