R:如何使用自定义比较方法对向量进行排序

时间:2020-02-28 14:06:13

标签: r sorting

我一直在寻找解决方案,但到目前为止尚未找到解决方案。我看到很多人问过这样的问题,但没有得到答案或对我不起作用的答案。

假设我有一个向量,如下面的代码所示,并使用R sort函数对其进行排序,我将使用g10作为第二个元素而不是最后一个元素来得到结果。因此,我正在寻找一种将自己的比较函数提供给sort函数的方法,因此sort函数将调用我的函数以比较两个元素以确定它们的顺序(例如,当我的函数使用“ g10”调用时) ,“ g2”作为参数,我的函数可以将每个参数分成字母和数字,并分别比较字母和数字,并根据我自己的规则返回-1、0或1。可以在许多其他语言(例如c,Perl等)中使用此功能。如果您知道使用矢量的工作代码示例,请多加赞赏。谢谢。

> groups <- c('g10', 'g2', 'g5', 'g9', 'g4', 'g8', 'g1', 'g3', 'g6', 'g7')
> groups <- sort(groups)
> groups
 [1] "g1"  "g10" "g2"  "g3"  "g4"  "g5"  "g6"  "g7"  "g8"  "g9"

2 个答案:

答案 0 :(得分:0)

我认为您需要sort_by包中的类似funprog的函数。

library(stringr)
library(funprog)

f <- function(x) as.numeric(str_extract(x, "\\d+"))

groups <- c('g10', 'g2', 'g5', 'g9', 'g4', 'g8', 'g1', 'g3', 'g6', 'g7')

sort_by(groups, f)
# [1] "g1"  "g2"  "g3"  "g4"  "g5"  "g6"  "g7"  "g8"  "g9"  "g10"

此处,它根据每个组中包含的数字对groups进行排序。您可以为sort_by提供多种功能:

f1 <- function(x) str_extract(x, "^[a-z]+")
f2 <- function(x) as.numeric(str_extract(x, "\\d+"))

groups <- c('g10', 'a2', 'f5', 'g9', 'g4', 'b8', 'c1', 'b3', 'a6', 'c17')

sort_by(groups, f1, f2)
# [1] "a2"  "a6"  "b3"  "b8"  "c1"  "c17" "f5"  "g4"  "g9"  "g10"

在这里,数据按照“前缀”排序,然后按照数字排序。

答案 1 :(得分:0)

这是使用order + gsub,即

的基本R解决方案
r <- groups[order(as.numeric(gsub("\\D","",groups)))]

这样

> r
 [1] "g1"  "g2"  "g3"  "g4"  "g5"  "g6"  "g7"  "g8"  "g9" 
[10] "g10"