'Move a column to first position in a data frame

I would like to have the last column of the data frame moved to the start (as first column). How can I do it in R?

My data.frame has about a thousand columns to changing the order wont to. I just want to pick one column and "move it to the start".



Solution 1:[1]

Dplyr's select() approach

Moving the last column to the start:

new_df <- df %>%
  select(last_column_name, everything())

This is also valid for any column and any quantity:

new_df <- df %>%
  select(col_5, col_8, everything())

Example using mtcars data frame:

head(mtcars, n = 2)
#                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4

# Last column is 'carb'
new_df <- mtcars %>% select(carb, everything())

head(new_df, n = 2)
#                   carb  mpg cyl disp  hp drat    wt  qsec vs am gear
# Mazda RX4            4 21.0   6  160 110 3.90 2.620 16.46  0  1    4
# Mazda RX4 Wag        4 21.0   6  160 110 3.90 2.875 17.02  0  1    4

Solution 2:[2]

You can change the order of columns by adressing them in the new order by choosing them explicitly with data[,c(ORDER YOU WANT THEM TO BE IN)]

If you just want the last column to be first use: data[,c(ncol(data),1:(ncol(data)-1))]

> head(cars)
  speed dist
1     4    2
2     4   10
3     7    4
4     7   22
5     8   16
6     9   10

> head(cars[,c(2,1)])
  dist speed
1    2     4
2   10     4
3    4     7
4   22     7
5   16     8
6   10     9

Solution 3:[3]

dplyr 1.0.0 now includes the relocate() function to reorder columns. The default behaviour is to move the named column(s) to the first position.

library(dplyr) # from version 1.0.0 

mtcars %>%
  relocate(carb) %>%
  head()

                  carb  mpg cyl disp  hp drat    wt  qsec vs am gear
Mazda RX4            4 21.0   6  160 110 3.90 2.620 16.46  0  1    4
Mazda RX4 Wag        4 21.0   6  160 110 3.90 2.875 17.02  0  1    4
Datsun 710           1 22.8   4  108  93 3.85 2.320 18.61  1  1    4
Hornet 4 Drive       1 21.4   6  258 110 3.08 3.215 19.44  1  0    3
Hornet Sportabout    2 18.7   8  360 175 3.15 3.440 17.02  0  0    3
Valiant              1 18.1   6  225 105 2.76 3.460 20.22  1  0    3

But other locations can be specifed with the .before or .after arguments:

mtcars %>%
  relocate(gear, carb, .before = cyl) %>%
  head()

                   mpg gear carb cyl disp  hp drat    wt  qsec vs am
Mazda RX4         21.0    4    4   6  160 110 3.90 2.620 16.46  0  1
Mazda RX4 Wag     21.0    4    4   6  160 110 3.90 2.875 17.02  0  1
Datsun 710        22.8    4    1   4  108  93 3.85 2.320 18.61  1  1
Hornet 4 Drive    21.4    3    1   6  258 110 3.08 3.215 19.44  1  0
Hornet Sportabout 18.7    3    2   8  360 175 3.15 3.440 17.02  0  0
Valiant           18.1    3    1   6  225 105 2.76 3.460 20.22  1  0

Solution 4:[4]

dataframe<-dataframe[,c(1000, 1:999)]

this will move your last column i.e. 1000th column to the first column.

Solution 5:[5]

If you want to move any named column to the first position, simply use:

df[,c(which(colnames(df)=="desired_colname"),which(colnames(df)!="desired_colname"))]

Solution 6:[6]

A native R approach that works with any number of rows or columns to move the last column of a dataframe to the first column position:

df <- df[,c(ncol(df),1:ncol(df)-1)]

It can be used to move any column to the first column by replacing:

df <- df[,c(your_column_number_here,1:ncol(df)-1)]

If you don't know the column number, but know the column label name, do the following replacing "your_column_name_here":

columnNumber <- which(colnames(df)=="your_column_name_here")
df <- df[,c(columnNumber,1:ncol(df)-1)]

Solution 7:[7]

There is also the data.table option with setcolorder():

library(data.table)
mtcars_copy <- copy(mtcars)
setDT(mtcars_copy)

# Move column "gear" in the first position
setcolorder(mtcars_copy, neworder = "gear")

head(mtcars_copy)

#    gear  mpg cyl disp  hp drat    wt  qsec vs am carb
# 1:    4 21.0   6  160 110 3.90 2.620 16.46  0  1    4
# 2:    4 21.0   6  160 110 3.90 2.875 17.02  0  1    4
# 3:    4 22.8   4  108  93 3.85 2.320 18.61  1  1    1
# 4:    3 21.4   6  258 110 3.08 3.215 19.44  1  0    1
# 5:    3 18.7   8  360 175 3.15 3.440 17.02  0  0    2
# 6:    3 18.1   6  225 105 2.76 3.460 20.22  1  0    1

If multiple columns, then mention the order in a vector:

setcolorder(mtcars_copy, neworder = c("vs", "carb"))

head(mtcars_copy)
#    vs carb gear  mpg cyl disp  hp drat    wt  qsec am
# 1:  0    4    4 21.0   6  160 110 3.90 2.620 16.46  1
# 2:  0    4    4 21.0   6  160 110 3.90 2.875 17.02  1
# 3:  1    1    4 22.8   4  108  93 3.85 2.320 18.61  1
# 4:  1    1    3 21.4   6  258 110 3.08 3.215 19.44  0
# 5:  0    2    3 18.7   8  360 175 3.15 3.440 17.02  0
# 6:  1    1    3 18.1   6  225 105 2.76 3.460 20.22  0

Solution 8:[8]

Move any column from any position for the first position in your data

n <- which(colnames(df)=="column_need_move")
column_need_move <- df$column_need_to_move
df <- cbind(column_need_move, df[,-n])

Solution 9:[9]

If you want to create a new column and have it be the first column, use the .before=1 argument:

my_data <- my_data %>% mutate(newcol = a*b, .before=1)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 marc_aragones
Solution 2
Solution 3 Ritchie Sacramento
Solution 4 Newbie
Solution 5 HT_079
Solution 6 brapplecache
Solution 7 Valentin_?tefan
Solution 8
Solution 9 DanY