Заголовок сортировки R по значению - PullRequest
0 голосов
/ 31 октября 2018

У меня есть данные частоты, рассчитанные по времени дня:

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')

Значение 0 означает с 12:00 до 1:00, 1 означает с 1:00 до 2:00. Мы можем видеть, что заголовки отсортированы случайным образом, и есть некоторые пропущенные значения (в данном случае, 5). Я бы хотел, чтобы R сортировал заголовки по возрастанию. И следующий шаг - найти пропущенное значение (например, [1,2,3,6,7], пропущены 4 и 5 периоды времени), а затем заменить значение NA на 0.

Есть ли простой способ выполнить это? Очень ценится!

1 Ответ

0 голосов
/ 31 октября 2018

Поскольку 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.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...