使用自定义顺序重新排序行

Dan*_*ian 40 r dplyr

鉴于数据:

library(data.table)
DT = data.table(category=LETTERS[1:3], b=1:3)
DT
#    category b
# 1:        A 1
# 2:        B 2
# 3:        C 3
Run Code Online (Sandbox Code Playgroud)

使用dplyr,如何重新排列行来获得特定的顺序c("C", "A", "B")category

#    category b
# 1:        C 3
# 2:        A 1
# 3:        B 2
Run Code Online (Sandbox Code Playgroud)

Hen*_*rik 68

首先,创建一个包含所需顺序字母的向量.然后match*带有要变量的变量的向量.match返回(第一)匹配的索引,可以插入slice:

library(dplyr)

# create a vector with letters in the desired order
x <- c("C", "A", "B")

DT %>%
  slice(match(x, category))
#   category b
# 1        C 3
# 2        A 1
# 3        B 2
Run Code Online (Sandbox Code Playgroud)

另一种方法是将"category"转换为a factor,设置levels为所需的顺序,并使用arrange:

DT %>%
  mutate(category =  factor(category, levels = x)) %>%
  arrange(category)    
#   category b
# 1        C 3
# 2        A 1
# 3        B 2
Run Code Online (Sandbox Code Playgroud)

*该match方法的灵感来自于这个答案.

  • 正如鼓舞人心的回答中所提到的,在使用`match()`时要注意重复的效果. (3认同)

小智 5

另一种选择可能如下,请注意,排列可以采用新索引的列表。

library(dplyr)

df <- data.frame(category = LETTERS[1:3], b = 1:3, stringsAsFactors = F)

# create a vector with letters in the desired order
x <- c("C", "A", "B")

df %>%
arrange(sapply(category, function(y) which(y == x))
Run Code Online (Sandbox Code Playgroud)