【问题标题】:R: sort by multiple columns with a specific order in each column (not ascending) [duplicate]R:按每列中特定顺序的多列排序(不升序)[重复]
【发布时间】:2018-04-12 09:44:36
【问题描述】:

非常感谢您花时间帮助这个.. 我有一个名为“MyData”的数据集,如下所示:我想用 A、B 和 C 列的特定顺序对整个数据集(A 到 E)进行排序。顺序可以由我定义。 首先按 A 排序,顺序为:“黄”、“绿”、“红” A 排序后,按 B 列排序,顺序为“X”、“Z”、“Y” A和B排序后,再按C排序,顺序应该是从大数到小数。

     A          B         C          D          E        
1  red         X        0.8        aaaa        111
2  yellow      Y        0.2        dddd        222
3  green       X        0.3        cccc        111
4  yellow      Z        0.6        dddd        333
5  green       Y        0.1        aaaa        123
6  yellow      X        0.5        cccc        324
7  yellow      X        0.4        zzzz        222
8  yellow      X        0.8        bbbb        126

以下是我想要的输出:

     A         B         C          D          E 
8  yellow      X        0.8        bbbb        126
6  yellow      X        0.5        cccc        324
7  yellow      X        0.4        zzzz        222
4  yellow      Z        0.6        dddd        333
2  yellow      Y        0.2        dddd        222
3  green       X        0.3        cccc        111
5  green       Y        0.1        aaaa        123
1  red         X        0.8        aaaa        111

我的实际数据集包含大约 100 行。 非常感谢!!!:)

【问题讨论】:

标签: r sorting dataframe multiple-columns


【解决方案1】:

或者在基础 R 中:

df[order(
    factor(df$A, levels = c("yellow", "green", "red")),
    factor(df$B, levels = c("X", "Z", "Y")),
    -df$C), ]
#    A B   C    D   E
#8 yellow X 0.8 bbbb 126
#6 yellow X 0.5 cccc 324
#7 yellow X 0.4 zzzz 222
#4 yellow Z 0.6 dddd 333
#2 yellow Y 0.2 dddd 222
#3  green X 0.3 cccc 111
#5  green Y 0.1 aaaa 123
#1    red X 0.8 aaaa 111

样本数据

df <- read.table(text =
    "     A          B         C          D          E
1  red         X        0.8        aaaa        111
2  yellow      Y        0.2        dddd        222
3  green       X        0.3        cccc        111
4  yellow      Z        0.6        dddd        333
5  green       Y        0.1        aaaa        123
6  yellow      X        0.5        cccc        324
7  yellow      X        0.4        zzzz        222
8  yellow      X        0.8        bbbb        126", header = T)

【讨论】:

    【解决方案2】:

    我们可以创建因子列并指定级别来排列列。最后一个mutate_if 是可选的,它只是将因子转换回字符。

    library(dplyr)
    
    dat2 <- dat %>%
      mutate(A = factor(A, level = c("yellow", "green", "red")),
             B = factor(B, c("X", "Z", "Y"))) %>%
      arrange(A, B, desc(C)) %>%
      mutate_if(is.factor, as.character)
    dat2
    #        A B   C    D   E
    # 1 yellow X 0.8 bbbb 126
    # 2 yellow X 0.5 cccc 324
    # 3 yellow X 0.4 zzzz 222
    # 4 yellow Z 0.6 dddd 333
    # 5 yellow Y 0.2 dddd 222
    # 6  green X 0.3 cccc 111
    # 7  green Y 0.1 aaaa 123
    # 8    red X 0.8 aaaa 111
    

    数据

    dat <- read.table(text = "     A          B         C          D          E        
    1  red         X        0.8        aaaa        111
    2  yellow      Y        0.2        dddd        222
    3  green       X        0.3        cccc        111
    4  yellow      Z        0.6        dddd        333
    5  green       Y        0.1        aaaa        123
    6  yellow      X        0.5        cccc        324
    7  yellow      X        0.4        zzzz        222
    8  yellow      X        0.8        bbbb        126",
                      header = TRUE, stringsAsFactors = FALSE)
    

    【讨论】:

    • 它有效...非常感谢!!!
    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2022-09-29
    • 2014-04-11
    • 2013-10-14
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多