我想根据列中的值(字符)对 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
,要么使用 match
和 vector
的顺序与预期以该顺序获取索引的顺序相同
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/