arrange after unite

After unite() arrange() organized SeqNum like so 1, 10, 11, ..., 19, 2, 20, ...

jj <- data.frame(TrainNum = 2100,
             SeqNum = 1:30)
jj %>% 
  unite(tnSn, TrainNum, SeqNum) %>% 
  arrange(tnSn)

Has anyone found a work around?

This is a little hacky, but you could do this:

library(tidyverse)

jj <- data.frame(TrainNum = 2100,
                 SeqNum = 1:30)

jj %>% 
  mutate(SeqNum = ifelse(SeqNum < 10, paste0("0", SeqNum), SeqNum)) %>% 
  unite(tnSn, TrainNum, SeqNum) %>% 
  arrange(tnSn)
#>       tnSn
#> 1  2100_01
#> 2  2100_02
#> 3  2100_03
#> 4  2100_04
#> 5  2100_05
#> 6  2100_06
#> 7  2100_07
#> 8  2100_08
#> 9  2100_09
#> 10 2100_10
#> 11 2100_11
#> 12 2100_12
#> 13 2100_13
#> 14 2100_14
#> 15 2100_15
#> 16 2100_16
#> 17 2100_17
#> 18 2100_18
#> 19 2100_19
#> 20 2100_20
#> 21 2100_21
#> 22 2100_22
#> 23 2100_23
#> 24 2100_24
#> 25 2100_25
#> 26 2100_26
#> 27 2100_27
#> 28 2100_28
#> 29 2100_29
#> 30 2100_30

Created on 2018-11-20 by the reprex package (v0.2.1)

Oh look, there's also tidyverse function, stringr::str_pad() that can help here! Could be useful if you had numbers larger than 2 digits!

library(tidyverse)

jj <- data.frame(TrainNum = 2100,
                 SeqNum = 1:30)

jj %>% 
  mutate(SeqNum = str_pad(SeqNum, width = 2, pad = "0")) %>% 
  unite(tnSn, TrainNum, SeqNum) %>% 
  arrange(tnSn)
#>       tnSn
#> 1  2100_01
#> 2  2100_02
#> 3  2100_03
#> 4  2100_04
#> 5  2100_05
#> 6  2100_06
#> 7  2100_07
#> 8  2100_08
#> 9  2100_09
#> 10 2100_10
#> 11 2100_11
#> 12 2100_12
#> 13 2100_13
#> 14 2100_14
#> 15 2100_15
#> 16 2100_16
#> 17 2100_17
#> 18 2100_18
#> 19 2100_19
#> 20 2100_20
#> 21 2100_21
#> 22 2100_22
#> 23 2100_23
#> 24 2100_24
#> 25 2100_25
#> 26 2100_26
#> 27 2100_27
#> 28 2100_28
#> 29 2100_29
#> 30 2100_30

Created on 2018-11-20 by the reprex package (v0.2.1)

5 Likes

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.