我一直在寻找解决方案,但到目前为止尚未找到解决方案。我看到很多人问过这样的问题,但没有得到答案或对我不起作用的答案。
假设我有一个向量,如下面的代码所示,并使用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"
答案 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 <- groups[order(as.numeric(gsub("\\D","",groups)))]
这样
> r
[1] "g1" "g2" "g3" "g4" "g5" "g6" "g7" "g8" "g9"
[10] "g10"