rfsrc rfsrc - 1 month ago 14
R Question

R: Sort columns by object class

Can you sort a

df
based on object class? Say

data("mtcars")
mtcars$cyl <- as.factor(mtcars$cyl)
mtcars$vs <- as.factor(mtcars$vs)
mtcars$am <- as.factor(mtcars$am)
sapply(mtcars,class)


and I want all numeric variables first and then all factors at the end? I want to be able to do this on a much larger dataset so I prefer solutions that do not rely on subsetting by column number. Cheers.

Answer

Maybe this one?

head(mtcars)

                   # 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
# Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
# Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
# Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

x <- mtcars[,names(sort(unlist(lapply(mtcars, class)), decreasing = T))]

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

In x, as you see, the columns cyl, vs and am that are of class factor are place at the end and those of class numeric first.