2015-11-03 3 views
0

Я хочу переместить столбец справа в какое-то место слева от фрейма данных. Поскольку я перемещаю только один столбец, и у меня много столбцов. Я думаю, что это переупорядочение df < - df [, c ("a", "b", "d", "c")] не будет эффективным. Поскольку dataframe содержит много строк, я хочу, чтобы свести к минимуму переписывания вещиКаков наиболее эффективный способ перемещения столбца в dataframe

от:

name var1 var2 var3 var4 var5 ... varN 
a  1 1 1 1 1  1 
b  1 1 1 1 1  1 
c  1 1 1 1 1  1 

к:

name var1 varN var2 var3 var4 ... varN-1 
    a  1 1 1 1 1  1 
    b  1 1 1 1 1  1 
    c  1 1 1 1 1  1 
+0

Посмотрите на '' выбор '' функции 'dplyr''. – Carl

ответ

2

Вы можете использовать вектор индексов столбцов, а не вектор имен столбцов , так что вы можете использовать обозначения последовательности, например:

my_seq = c(1,ncol(df),2:(ncol(df)-1)) 
df[,my_seq] 

Например, если ваша дата AFRAME имеет 17 столбцов, получим:

> my_seq 
[1] 1 17 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
0

с dplyr

df %>% select(name,var1,varN,everthing()) 
+1

Он не просит удалить столбец. Он хочет переместить последний столбец влево. – Carl

2

Вы можете получить там с append:

df <- data.frame(name=letters[1:5],var1=1,var2=1,var3=1,var4=1,var5=1) 

# using names 
df[append(names(df)[-ncol(df)], names(df)[ncol(df)], after=2)] 

# using positions 
df[append(seq(ncol(df)-1), ncol(df), after=2)] 

# name var1 var5 var2 var3 var4 
#1 a 1 1 1 1 1 
#2 b 1 1 1 1 1 
#3 c 1 1 1 1 1 
#4 d 1 1 1 1 1 
#5 e 1 1 1 1 1 
+0

Вы бы рекомендовали это в качестве решения, учитывая, насколько неуклюжим код? База R допускает численное индексирование, которое кажется более интуитивным, чем ваше предложение. Когда это будет предпочтительный подход? – brittenb

+0

@brittenb - второй пример, который я приводил выше, - это численное индексирование. Это не clunkier, чем 'df [, c (1, ncol (df), 2: (ncol (df) -1))]' – thelatemail

+0

Мне не нравится включение функции «ncol» в индексирование; Я согласен, что это неуклюже. Я бы просто установил его как две строки: «N <- ncol (df); df <- df [, c (1, N, 2: (N-1))] 'Я просто думаю, что append и seq свернутся, что происходит. Только мои два цента. Я только спрашивал, потому что я видел ваши другие ответы и знаю, что вы знаете, о чем говорите, поэтому я искал ваши рассуждения. – brittenb

0

Если кадр данных df имеет n столбцы и вы должны двигаться m th column до 2-го положения с начала

df <- subset(df, select=c(1, m, 2:m-1, m+1:n))

В вашем случае:

df <- subset(df, select=c(name:var1, varN, var2:varN-1))

Это также можно записать в виде:

df <- subset(df, select=c(name, var1, varN, var2, var3,....,varN-1))

Вы можете использовать имена столбцов, а также номера столбцов для принятия нового порядок столбцов.

2

Я бы рекомендовал посмотреть на the moveMe function с my "SOfun" package.

С этим решением было бы что-то вроде:

df <- data.frame(name=letters[1:5],var1=1,var2=1,var3=1,var4=1,var5=1) 

library(SOfun) 

df[moveMe(names(df), "var5 before var4")] 
# name var1 var2 var3 var5 var4 
# 1 a 1 1 1 1 1 
# 2 b 1 1 1 1 1 
# 3 c 1 1 1 1 1 
# 4 d 1 1 1 1 1 
# 5 e 1 1 1 1 1 

Вы можете также сложные высказывания:

df[moveMe(names(df), "var5 before var2; name last")] 
# var1 var5 var2 var3 var4 name 
# 1 1 1 1 1 1 a 
# 2 1 1 1 1 1 b 
# 3 1 1 1 1 1 c 
# 4 1 1 1 1 1 d 
# 5 1 1 1 1 1 e 

Если вы хотите сделать это наиболее эффективно, вы должны рассмотреть вопрос о преобразовании ваши данные на «data.table» и используя setcolorder. Это изменит порядок столбцов по ссылке, а не путем копирования ваших данных.

library(data.table) 
dt <- as.data.table(df) 

setcolorder(dt, moveMe(names(dt), "var5 before var4")) 
dt 
# name var1 var2 var3 var5 var4 
# 1: a 1 1 1 1 1 
# 2: b 1 1 1 1 1 
# 3: c 1 1 1 1 1 
# 4: d 1 1 1 1 1 
# 5: e 1 1 1 1 1