当自定义顺序包含在数据框中找不到的值时,是否可以通过自定义顺序在数据框中排列行?
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
我正在尝试为订单创建通用脚本,因此我需要保持订单向量不变,以解决所有情况。我尝试过因素和安排方法而没有运气。
答案 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)
您可以使用match
和order
类似地进行此操作。
df[order(match(df$value, order)), ]
# name value
#2 b 2
#1 a 4
#4 d O
#3 c L