首页 > 解决方案 > 对列内的值进行排序

问题描述

出于某种原因,我的范围值之一50 - 100无法在列中重新排列。我也用过arrange(x),还是不行。我希望您的支持帮助我解决这个问题。

如何正确地重新排列我的列,所以50 - 100紧随其后0 - 50

这是数据集:

Rows: 143
Columns: 6
$ group <fct> 2.5 - 3.0, 3.0 - 3.5, 3.5 - 4.0, 4.0 - 4.5, 4.5 - 5.0, 5.0 - 5.5, 5.5 - 6.0, 6.0 - 6.5, 6.5 - 7.0, 7.0 - 7.5, 7.5 - 8.0, 2.5 - 3.0, 3.0 -...
$ x     <fct> 0 - 50, 0 - 50, 0 - 50, 0 - 50, 0 - 50, 0 - 50, 0 - 50, 0 - 50, 0 - 50, 0 - 50, 0 - 50, 100 - 150, 100 - 150, 100 - 150, 100 - 150, 100 -...
$ y1    <int> 20108, 8042, 3347, 1529, 690, 340, 121, 63, 24, 3, NA, 1914, 1514, 646, 216, 84, 46, 9, 2, 1, 1, NA, 1056, 1276, 881, 289, 87, 31, 9, 4, ...
$ y2    <int> 20658, 8171, 3552, 1717, 894, 377, 127, 38, 10, 12, 4, 2819, 1815, 639, 230, 98, 37, 20, 7, 3, 1, NA, 1728, 1705, 948, 328, 118, 41, 16, ...
$ y3    <int> 20729, 8281, 3428, 1520, 853, 398, 160, 57, 10, 4, 5, 2556, 1633, 625, 219, 90, 56, 15, 10, NA, 1, 2, 1564, 1566, 938, 303, 103, 33, 16, ...
$ y4    <int> 19436, 7767, 3251, 1414, 697, 356, 125, 48, 22, 7, 4, 2035, 1645, 658, 189, 71, 47, 26, 6, 2, 1, 1, 1149, 1340, 924, 304, 85, 32, 9, 4, N...

可重现的代码:

structure(list(group = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 
8L, 9L, 10L, 11L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 1L, 2L, 3L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 11L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
11L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 
8L, 9L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 4L, 5L, 7L, 
8L), .Label = c("2.5 - 3.0", "3.0 - 3.5", "3.5 - 4.0", "4.0 - 4.5", 
"4.5 - 5.0", "5.0 - 5.5", "5.5 - 6.0", "6.0 - 6.5", "6.5 - 7.0", 
"7.0 - 7.5", "7.5 - 8.0"), class = "factor"), x = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
11L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 13L, 
13L, 13L, 13L, 13L, 13L, 13L, 13L, 14L, 14L, 14L, 14L, 14L, 14L, 
14L, 14L, 14L, 14L, 15L, 15L, 15L, 15L), .Label = c("0 - 50", 
"100 - 150", "150 - 200", "200 - 250", "250 - 300", "300 - 350", 
"350 - 400", "400 - 450", "450 - 500", "50 - 100", "500 - 550", 
"550 - 600", "600 - 650", "650 - 700", "700 - 750"), class = "factor"), 
    y1 = c(20108L, 8042L, 3347L, 1529L, 690L, 340L, 121L, 63L, 
    24L, 3L, 0L, 1914L, 1514L, 646L, 216L, 84L, 46L, 9L, 2L, 
    1L, 1L, 0L, 1056L, 1276L, 881L, 289L, 87L, 31L, 9L, 4L, 0L, 
    3L, 0L, 508L, 545L, 563L, 265L, 68L, 22L, 4L, 6L, 0L, 0L, 
    1L, 100L, 102L, 201L, 108L, 60L, 23L, 1L, 1L, 0L, 10L, 16L, 
    49L, 96L, 46L, 15L, 1L, 1L, 0L, 0L, 4L, 1L, 26L, 55L, 24L, 
    11L, 4L, 1L, 0L, 0L, 2L, 1L, 20L, 30L, 18L, 5L, 2L, 2L, 0L, 
    1L, 0L, 2L, 8L, 21L, 18L, 3L, 1L, 1L, 3709L, 1536L, 419L, 
    165L, 63L, 39L, 19L, 6L, 4L, 3L, 0L, 5L, 3L, 29L, 34L, 15L, 
    6L, 0L, 1L, 0L, 3L, 14L, 33L, 51L, 21L, 9L, 3L, 2L, 1L, 1L, 
    6L, 5L, 38L, 31L, 18L, 5L, 1L, 1L, 0L, 0L, 5L, 4L, 17L, 14L, 
    4L, 0L, 0L, 0L, 0L, 2L, 0L, 0L), y2 = c(20658L, 8171L, 3552L, 
    1717L, 894L, 377L, 127L, 38L, 10L, 12L, 4L, 2819L, 1815L, 
    639L, 230L, 98L, 37L, 20L, 7L, 3L, 1L, 0L, 1728L, 1705L, 
    948L, 328L, 118L, 41L, 16L, 5L, 4L, 0L, 0L, 794L, 855L, 597L, 
    249L, 98L, 26L, 7L, 0L, 1L, 0L, 0L, 164L, 185L, 221L, 172L, 
    65L, 13L, 1L, 1L, 1L, 27L, 22L, 71L, 105L, 62L, 18L, 1L, 
    0L, 0L, 1L, 10L, 4L, 41L, 74L, 30L, 9L, 1L, 0L, 0L, 0L, 3L, 
    3L, 31L, 55L, 21L, 11L, 3L, 0L, 0L, 0L, 2L, 1L, 12L, 29L, 
    18L, 11L, 5L, 0L, 4116L, 1520L, 485L, 185L, 64L, 58L, 25L, 
    10L, 7L, 2L, 2L, 5L, 17L, 55L, 58L, 24L, 6L, 1L, 0L, 2L, 
    8L, 22L, 55L, 53L, 33L, 6L, 3L, 0L, 0L, 0L, 2L, 17L, 38L, 
    47L, 25L, 7L, 2L, 0L, 1L, 4L, 8L, 15L, 14L, 11L, 4L, 1L, 
    0L, 1L, 0L, 0L, 2L, 0L), y3 = c(20729L, 8281L, 3428L, 1520L, 
    853L, 398L, 160L, 57L, 10L, 4L, 5L, 2556L, 1633L, 625L, 219L, 
    90L, 56L, 15L, 10L, 0L, 1L, 2L, 1564L, 1566L, 938L, 303L, 
    103L, 33L, 16L, 3L, 0L, 1L, 1L, 761L, 740L, 584L, 257L, 108L, 
    25L, 6L, 2L, 0L, 0L, 0L, 163L, 186L, 204L, 153L, 67L, 24L, 
    10L, 0L, 1L, 23L, 18L, 56L, 108L, 60L, 11L, 0L, 0L, 1L, 0L, 
    6L, 9L, 27L, 61L, 27L, 4L, 6L, 2L, 1L, 1L, 6L, 7L, 23L, 45L, 
    25L, 10L, 4L, 1L, 0L, 0L, 5L, 3L, 20L, 34L, 27L, 3L, 5L, 
    0L, 4164L, 1565L, 497L, 178L, 69L, 52L, 29L, 7L, 3L, 3L, 
    3L, 2L, 19L, 38L, 46L, 21L, 9L, 1L, 0L, 1L, 7L, 15L, 58L, 
    61L, 27L, 10L, 1L, 0L, 0L, 0L, 5L, 17L, 39L, 34L, 26L, 6L, 
    2L, 1L, 0L, 1L, 9L, 15L, 15L, 16L, 1L, 1L, 0L, 1L, 1L, 1L, 
    2L, 1L), y4 = c(19436L, 7767L, 3251L, 1414L, 697L, 356L, 
    125L, 48L, 22L, 7L, 4L, 2035L, 1645L, 658L, 189L, 71L, 47L, 
    26L, 6L, 2L, 1L, 1L, 1149L, 1340L, 924L, 304L, 85L, 32L, 
    9L, 4L, 0L, 0L, 0L, 510L, 524L, 579L, 242L, 95L, 26L, 6L, 
    2L, 1L, 2L, 0L, 117L, 117L, 198L, 145L, 63L, 19L, 7L, 0L, 
    0L, 26L, 14L, 49L, 70L, 52L, 14L, 2L, 0L, 0L, 1L, 3L, 2L, 
    20L, 47L, 30L, 8L, 3L, 1L, 2L, 1L, 1L, 1L, 20L, 30L, 15L, 
    4L, 2L, 2L, 1L, 0L, 4L, 0L, 8L, 19L, 12L, 9L, 1L, 0L, 3838L, 
    1525L, 450L, 162L, 72L, 43L, 27L, 6L, 1L, 0L, 0L, 3L, 7L, 
    41L, 46L, 22L, 2L, 2L, 1L, 1L, 3L, 11L, 40L, 54L, 20L, 5L, 
    2L, 0L, 0L, 0L, 1L, 14L, 16L, 40L, 21L, 5L, 6L, 2L, 0L, 1L, 
    2L, 9L, 15L, 6L, 2L, 0L, 1L, 0L, 0L, 0L, 0L, 0L)), row.names = c(NA, 
-143L), class = c("tbl_df", "tbl", "data.frame"))

标签: rdataframe

解决方案


实际上,您的数据是“正确”排序的,因为字符的顺序是按字母顺序排列的,因此与数字的顺序不同。具体"50"来之后"450"。你可以做的是重新排列你的因子水平。为此,我们可以使用我们使用的第一个数字gsub。我使用一个新变量x2来表明值不会改变。

d$x2 <- factor(d$x, levels=levels(d$x)[order(as.numeric(gsub("( -.*)", "", levels(d$x))))])
d <- d[order(d$x2), ]
d
#         group         x    y1    y2    y3    y4        x2
# 1   2.5 - 3.0    0 - 50 20108 20658 20729 19436    0 - 50
# 2   3.0 - 3.5    0 - 50  8042  8171  8281  7767    0 - 50
# 3   3.5 - 4.0    0 - 50  3347  3552  3428  3251    0 - 50
# 4   4.0 - 4.5    0 - 50  1529  1717  1520  1414    0 - 50
# 5   4.5 - 5.0    0 - 50   690   894   853   697    0 - 50
# 6   5.0 - 5.5    0 - 50   340   377   398   356    0 - 50
# 7   5.5 - 6.0    0 - 50   121   127   160   125    0 - 50
# 8   6.0 - 6.5    0 - 50    63    38    57    48    0 - 50
# 9   6.5 - 7.0    0 - 50    24    10    10    22    0 - 50
# 10  7.0 - 7.5    0 - 50     3    12     4     7    0 - 50
# 11  7.5 - 8.0    0 - 50     0     4     5     4    0 - 50
# 92  2.5 - 3.0  50 - 100  3709  4116  4164  3838  50 - 100
# 93  3.0 - 3.5  50 - 100  1536  1520  1565  1525  50 - 100
# 94  3.5 - 4.0  50 - 100   419   485   497   450  50 - 100
# 95  4.0 - 4.5  50 - 100   165   185   178   162  50 - 100
# 96  4.5 - 5.0  50 - 100    63    64    69    72  50 - 100
# 97  5.0 - 5.5  50 - 100    39    58    52    43  50 - 100
# 98  5.5 - 6.0  50 - 100    19    25    29    27  50 - 100
# 99  6.0 - 6.5  50 - 100     6    10     7     6  50 - 100
# 100 6.5 - 7.0  50 - 100     4     7     3     1  50 - 100
# 101 7.0 - 7.5  50 - 100     3     2     3     0  50 - 100
# 12  2.5 - 3.0 100 - 150  1914  2819  2556  2035 100 - 150
# 13  3.0 - 3.5 100 - 150  1514  1815  1633  1645 100 - 150
# ...

推荐阅读