如何在R中对组内的列进行排序?

4

我有一个数据帧(data frame)

df <- data.frame(
  "Class" = c('Class 8','Class 9','Class 10','Class 8','Class 9','Class 10','Class 8','Class 9','Class 10'),
  "Status" = c('Good','Good','Good','Better','Better','Better','Best','Best','Best'),
  "Percentage" = c(4,4,6,14,13,15,83,81,78),
  stringsAsFactors = FALSE
)

我有一个向量,描述了每个组内状态的顺序。

ratingOrder <<- c('Good','Better','Best')

我正在尝试按照向量中给定的顺序为每个类别排列状态。

这是期望的输出。

     Class Status Percentage
1  Class 8   Good          4
2  Class 8 Better          4
3  Class 8   Best          6
4  Class 9   Good         14
5  Class 9 Better         13
6  Class 9   Best         15
7  Class 10  Good         83
8  Class 10 Better         81
9  Class 10  Best         78

有人能提供一个适当的解决方案来实现这个吗?

先行致谢!!

4个回答

3
您可以使用“factor”列来考虑顺序。您需要解决的另一件事是“Class”列,需要以数字形式排序才能正常排序。以下是使用“dplyr”的解决方案:
library(dplyr)

df %>% 
  mutate(Status = factor(Status, levels = ratingOrder),
         Class = as.numeric(gsub("Class ", "", Class))) %>%
  arrange(Class, Status)

输出:

  Class Status Percentage
1     8   Good          4
2     8 Better         14
3     8   Best         83
4     9   Good          4
5     9 Better         13
6     9   Best         81
7    10   Good          6
8    10 Better         15
9    10   Best         78

1
一种基本的R选项:

df$Status <- factor(df$Status, levels = ratingOrder) 
df$Class <- factor(df$Class, levels = paste("Class", 8:10))

df[order(df$Class, df$Status), ]

     Class Status Percentage
1  Class 8   Good          4
4  Class 8 Better         14
7  Class 8   Best         83
2  Class 9   Good          4
5  Class 9 Better         13
8  Class 9   Best         81
3 Class 10   Good          6
6 Class 10 Better         15
9 Class 10   Best         78

1
一种使用 dplyr 的可能解决方案。
df %>% 
  mutate(Status = factor(Status, levels = ratingOrder),
         Class = as.numeric(gsub("\\D", "", Class))) %>%
  arrange(Class, Status)

match 函数用于即时创建一个数字向量,类似于 ratingOrder 的顺序(有关参考,请参见 this 帖子)。

输出

#      Class Status Percentage
# 1  Class 8   Good          4
# 2  Class 8 Better         14
# 3  Class 8   Best         83
# 4  Class 9   Good          4
# 5  Class 9 Better         13
# 6  Class 9   Best         81
# 7 Class 10   Good          6
# 8 Class 10 Better         15
# 9 Class 10   Best         78

0

有一些 dplyr 的解决方案,但我想提出:

df %>%
  arrange(as.integer(str_extract(Class, "\\d+")), match(Status, ratingOrder))

其也产生

     Class Status Percentage
1  Class 8   Good          4
2  Class 8 Better         14
3  Class 8   Best         83
4  Class 9   Good          4
5  Class 9 Better         13
6  Class 9   Best         81
7 Class 10   Good          6
8 Class 10 Better         15
9 Class 10   Best         78

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接