首页 > 解决方案 > R使用它们的值对标题进行排序

问题描述

我有一个按一天中的时间计算的频率数据:

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。

有没有简单的方法来完成这个?非常感激!

标签: r

解决方案


因为 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.)


推荐阅读