Поскольку R вдумчиво добавляет X
к каждому из имен столбцов (поскольку ему не нравятся имена столбцов, начинающиеся с цифр), нам нужно знать, как их удалить:
gsub("X", "", colnames(my.data))
# [1] "0" "1" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "2" "20" "21"
# [16] "22" "23" "3" "4" "6" "7" "8" "9"
(Если вы используете read.table(..., check.names=FALSE)
, тогда имена столбцов будут необработанными числами, не требующими шага gsub
.) При этом мы просто хотим изменить порядок на основе целочисленного значения этих строк.
my.data[ order(as.integer(gsub("X", "", colnames(my.data)))) ]
# X0 X1 X2 X3 X4 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23
# 1 5 3 2 1 3 7 8 11 8 3 7 10 11 13 17 18 14 8 4 2 1 4 1
и, следовательно,
my.data[ colnames(my.data)[ order(as.integer(gsub("X", "", colnames(my.data)))) ] ]
# X0 X1 X2 X3 X4 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23
# 1 5 3 2 1 3 7 8 11 8 3 7 10 11 13 17 18 14 8 4 2 1 4 1
Если у вас есть возможность менять заголовки при чтении, тогда:
my.data <- read.table(text = '
0 1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 3 4 6 7 8 9
5 3 3 7 10 11 13 17 18 14 8 4 2 2 1 4 1 1 3 7 8 11 8
', header = TRUE, stringsAsFactors = FALSE, na.strings = 'NA', check.names=FALSE)
my.data
# 0 1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 3 4 6 7 8 9
# 1 5 3 3 7 10 11 13 17 18 14 8 4 2 2 1 4 1 1 3 7 8 11 8
my.data[ order(as.integer(colnames(my.data))) ]
# 0 1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# 1 5 3 2 1 3 7 8 11 8 3 7 10 11 13 17 18 14 8 4 2 1 4 1
(Нам все еще нужно as.integer
, потому что имена столбцов всегда возвращаются как character
.)