我想根据列中的值(字符)对 R 中的数据框进行半反向排序。

我有以下示例数据集:

# Sample data
df <- read.table(text="id value
                 cx-01    1
                 cx-01    2
                 cx-02    1
                 cx-02    2
                 cx-02    3
                 cx-03    1
                 cx-03    2
                 px-01    1
                 px-01    2
                 px-02    1
                 px-02    2
                 px-02    3
                 px-03    1
                 px-03    2
                 rx-01    1
                 rx-01    2
                 rx-02    1
                 rx-02    2
                 rx-02    3
                 rx-03    1
                 rx-03    2", header=TRUE)

预期输出:
      id value
1  cx-03     2
2  cx-03     1
3  cx-02     3
4  cx-02     2
5  cx-02     1
6  cx-01     2
7  cx-01     1
8  rx-03     2
9  rx-03     1
10 rx-02     3
11 rx-02     2
12 rx-02     1
13 rx-01     2
14 rx-01     1
15 px-03     2
16 px-03     1
17 px-02     3
18 px-02     2
19 px-02     1
20 px-01     2
21 px-01     1

我尝试使用基本 R 的 order() 函数,但遗憾的是没有成功。此外,我尝试使用 plyr 包的排列功能,但是,我没有设法按照需要对数据进行排序。

是否可以根据自己提供的序列(因此不是按字母顺序排列)对第一列中的标签进行排序?

最佳答案

我们可以将 arrange 分别放在 'id' 的数字和字母部分,并按 desc 结束顺序排列 'value'。字母部分似乎是自定义顺序,因此要么使用指定的 factor 转换为 levels,要么使用 matchvector 的顺序与预期以该顺序获取索引的顺序相同

library(tidyverse)
df %>%
   arrange(match(str_remove(id, "-\\d+"), c("cx", "rx", "px")),
          readr::parse_number(as.character(id)), desc(value))
#      id value
#1  cx-03     2
#2  cx-03     1
#3  cx-02     3
#4  cx-02     2
#5  cx-02     1
#6  cx-01     2
#7  cx-01     1
#8  rx-03     2
#9  rx-03     1
#10 rx-02     3
#11 rx-02     2
#12 rx-02     1
#13 rx-01     2
#14 rx-01     1
#15 px-03     2
#16 px-03     1
#17 px-02     3
#18 px-02     2
#19 px-02     1
#20 px-01     2
#21 px-01     1

关于r - 在 R 中对数据框进行排序(基于列值),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55881364/

10-13 06:04
查看更多