ip2018
ip2018

Reputation: 715

Dplyr mutate new column at a specified location

An example:

a = c(10,20,30)
b = c(1,2,3)
c = c(4,5,6)
d = c(7,8,9)
df=data.frame(a,b,c,d)

library(dplyr)

df_1 = df %>% mutate(a1=sum(a+1))

How do I add "a1" after "a" (or any other defined position) and NOT at the end?

Thank you.

Upvotes: 29

Views: 34702

Answers (5)

LMc
LMc

Reputation: 18612

dplyr >= 1.0.0

relocate was added as a new verb to change the order of one or more columns. If you pipe the output of your mutate the syntax for relocate also uses .before and .after arguments:

df_1 %>% 
  relocate(a1, .after = a)
   a a1 b c d
1 10 63 1 4 7
2 20 63 2 5 8
3 30 63 3 6 9

An additional benefit is you can also move multiple columns using any tidyselect syntax:

df_1 %>% 
  relocate(c:a1, .before = b)
   a c d a1 b
1 10 4 7 63 1
2 20 5 8 63 2
3 30 6 9 63 3

Upvotes: 4

monkeytennis
monkeytennis

Reputation: 898

An update that might be useful for others who find this question - this can now be achieved directly within mutate (I'm using dplyr v1.0.2).

Just specify which existing column the new column should be positioned after or before, e.g.:

df_after <- df %>% 
   mutate(a1=sum(a+1), .after = a)

df_before <- df %>% 
   mutate(a1=sum(a+1), .before = b)

Upvotes: 54

Joris C.
Joris C.

Reputation: 6234

Extending on www's answer, we can use dplyr's select_helper functions to reorder newly created columns as we see fit:

library(dplyr)

## add a1 after a
df %>% 
    mutate(a1 = sum(a + 1)) %>%
    select(a, a1, everything())
#>    a a1 b c d
#> 1 10 63 1 4 7
#> 2 20 63 2 5 8
#> 3 30 63 3 6 9

## add a1 after c
df %>% 
    mutate(a1 = sum(a + 1)) %>%
    select(1:c, a1, everything())
#>    a b c a1 d
#> 1 10 1 4 63 7
#> 2 20 2 5 63 8
#> 3 30 3 6 63 9

Upvotes: 10

akrun
akrun

Reputation: 886938

Another option is add_column from tibble

library(tibble)    
add_column(df, a1 = sum(a + 1), .after = "a")
#   a a1 b c d
#1 10 63 1 4 7
#2 20 63 2 5 8
#3 30 63 3 6 9

Upvotes: 18

www
www

Reputation: 39154

The mutate function will always add the newly created column at the end. However, we can sort the column alphabetically after the mutate function using select.

library(dplyr)

df_1 <- df %>% 
  mutate(a1 = sum(a + 1)) %>%
  select(sort(names(.)))
df_1
#    a a1 b c d
# 1 10 63 1 4 7
# 2 20 63 2 5 8
# 3 30 63 3 6 9

Upvotes: 2

Related Questions