根据向量对数据帧行进行排序,优先级顺序包含表

时间:2020-11-11 00:52:12

标签: r

当自定义顺序包含在数据框中找不到的值时,是否可以通过自定义顺序在数据框中排列行?

order <- c("1", "2", "3A", "3B", "4", "R1", "R2", "O", "L")

df <- data.frame(name = letters[1:4], value = c("4", "2", "L", "O"))

> df
  name value
1    a     4
2    b     2
3    c     L
4    d     O

#Desired output
> df
  name value
1    b     2
2    a     4
3    d     O
4    c     L

我正在尝试为订单创建通用脚本,因此我需要保持订单向量不变,以解决所有情况。我尝试过因素和安排方法而没有运气。

2 个答案:

答案 0 :(得分:2)

使用ordered factor

df[order(ordered(df$value, order)),]
#  name value
#2    b     2
#1    a     4
#4    d     O
#3    c     L

但是,这很令人困惑,因为您已经命名了排序向量order,该向量也用于order()函数。如果您对此进行编辑,将更容易理解。

vecord <- c("1", "2", "3A", "3B", "4", "R1", "R2", "O", "L")
df[order(ordered(df$value, vecord)),]
#  name value
#2    b     2
#1    a     4
#4    d     O
#3    c     L

这使您可以指定优先级,即使这些值尚不存在于集合中,也可以稍后添加。

ordered(df$value, vecord)
#[1] 4 2 L O
#Levels: 1 < 2 < 3A < 3B < 4 < R1 < R2 < O < L

答案 1 :(得分:1)

您可以使用matchorder类似地进行此操作。

df[order(match(df$value, order)), ]

#  name value
#2    b     2
#1    a     4
#4    d     O
#3    c     L