This is happening because the variable you are using to order your data is a character variable and not a numeric variable, so all values starting with 1 come before those starting with 2.
One approach would be to split age into two variables and convert age into a numeric variable. Then, you can sort by that column and get your expected results.
library(tidyverse)
LX <- data.frame(
age = c("10-WNW", "0-N", "4-ESE", "1-NNE", "2-ENE", "3-E", "11-NNW", "4-ESE"),
income = c( 25.2, 10.5, 11, 21.9, 44, 11.5, 45, 16))
LX %>%
separate(age, into = c("age", "direction"), sep = "-") %>%
mutate(age = as.numeric(age)) %>%
arrange(age)
#> age direction income
#> 1 0 N 10.5
#> 2 1 NNE 21.9
#> 3 2 ENE 44.0
#> 4 3 E 11.5
#> 5 4 ESE 11.0
#> 6 4 ESE 16.0
#> 7 10 WNW 25.2
#> 8 11 NNW 45.0
Created on 2019-08-06 by the reprex package (v0.3.0)