R:按多列排序,每列中有特定顺序(不是升序)

时间:2018-04-12 09:44:37

标签: r sorting dataframe multiple-columns

非常感谢你花时间帮助这个.. 我有一个名为" 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行。 非常感谢!!! :)

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我们可以创建因子列并指定排列列的级别。最后一个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)