是否可以使用R中的词法排序对字母数字值向量进行排序?

是否可以使用R中的词法排序对字母数字值向量进行排序?,r,sorting,R,Sorting,比如,我有一个向量,如下所示: v1<- c("p 1", "p 2", "p 10", "p 11") 不过,我想要sortv1 [1] "p 1" "p 2" "p 10" "p 11" 根据帮助文件,sort似乎不允许词法排序。我想知道在不安装任何附加软件包的情况下是否可以进行词法排序。这里有一种方法。制作一个矢量,其中数字用零填充,然后按此矢量排序 v1.padded <- mapply(gsub, list('\\d+'), sprintf('%.4d', as.nu

比如,我有一个向量,如下所示:

v1<- c("p 1", "p 2", "p 10", "p 11")
不过,我想要sortv1

[1] "p 1"  "p 2" "p 10" "p 11"

根据帮助文件,sort似乎不允许词法排序。我想知道在不安装任何附加软件包的情况下是否可以进行词法排序。

这里有一种方法。制作一个矢量,其中数字用零填充,然后按此矢量排序

v1.padded <- mapply(gsub, list('\\d+'), sprintf('%.4d', as.numeric(regmatches(v1, gregexpr('\\d+', v1)))), v1)
# "p 0001" "p 0002" "p 0010" "p 0011"
v1[order(v1.padded)]
# "p 1"  "p 2"  "p 10" "p 11"
这里有第二种方法,可以推广到字符串有多个数字的情况

v1<- c("p 1 1", "p 11 1", "p 1 2", "p 2 3", "p 10 4")
parallel.split <- lapply(data.frame(do.call(rbind, strsplit(v1, ' ')), stringsAsFactors=FALSE), type.convert, as.is=TRUE)
inter <- do.call(interaction, c(parallel.split, list(lex.order=TRUE)))
v1[order(inter)]
# [1] "p 1 1"  "p 1 2"  "p 2 3"  "p 10 4" "p 11 1"

这里有一条路。制作一个矢量,其中数字用零填充,然后按此矢量排序

v1.padded <- mapply(gsub, list('\\d+'), sprintf('%.4d', as.numeric(regmatches(v1, gregexpr('\\d+', v1)))), v1)
# "p 0001" "p 0002" "p 0010" "p 0011"
v1[order(v1.padded)]
# "p 1"  "p 2"  "p 10" "p 11"
这里有第二种方法,可以推广到字符串有多个数字的情况

v1<- c("p 1 1", "p 11 1", "p 1 2", "p 2 3", "p 10 4")
parallel.split <- lapply(data.frame(do.call(rbind, strsplit(v1, ' ')), stringsAsFactors=FALSE), type.convert, as.is=TRUE)
inter <- do.call(interaction, c(parallel.split, list(lex.order=TRUE)))
v1[order(inter)]
# [1] "p 1 1"  "p 1 2"  "p 2 3"  "p 10 4" "p 11 1"

您可以查看mixedsort的代码,然后自己将其键入R。这样,您就可以在不安装额外软件包的情况下使用该功能

或者,您也可以在将字符串拆分为片段后使用order函数:

1 <- c('p 1', 'q 2','p 2','p 11', 'p 10')
sort(v1)

tmp <- strsplit(v1, ' +')
tmp1 <- sapply(tmp, '[[', 1)
tmp2 <- as.numeric(sapply(tmp, '[[', 2))
v1[ order( tmp1, tmp2 ) ]

如果所有数据都以p开头,那么您可以将其去掉,强制为数字并按顺序使用。

您可以查看mixedsort的代码,然后自己将其键入R。这样,您就可以在不安装额外软件包的情况下使用该功能

或者,您也可以在将字符串拆分为片段后使用order函数:

1 <- c('p 1', 'q 2','p 2','p 11', 'p 10')
sort(v1)

tmp <- strsplit(v1, ' +')
tmp1 <- sapply(tmp, '[[', 1)
tmp2 <- as.numeric(sapply(tmp, '[[', 2))
v1[ order( tmp1, tmp2 ) ]

如果所有数据都以p开头,则可以将其去掉,强制为数字并按顺序使用。

From?sort:字符向量的排序顺序将取决于所用区域设置的排序顺序:请参阅“比较”。如果您的情况是:一些字符后跟空格,然后只有数字,然后你可以做类似的事情:v1[orderas.numericgsub.*,v1]@Arun我想做一些类似但不那么优雅的v1[orderas.numericsubstrv1,3,ncharv1],但我希望这个方法更具普遍性,因为它是我正在编写的函数的一部分。如果不可能的话,我想我会要求所有的输入都是数字。然后,约书亚的回答对其进行了总结。因为你写的是你自己的函数,也许您可以查看gtools包中mixedorder的代码,看看该代码的哪一部分与您的需要最相关。from?sort:字符向量的排序顺序将取决于所用区域设置的排序顺序:请参阅“比较”。如果您的案例是这样的:一些字符后跟一个空格,然后只有数字,然后你可以做类似的事情:v1[orderas.numericgsub.*,v1]@Arun我想做一些类似但不那么优雅的v1[orderas.numericsubstrv1,3,ncharv1],但我希望这个方法更具普遍性,因为它是我正在编写的函数的一部分。如果不可能,我想我会要求所有的输入都是数字。然后,Joshua的回答对其进行了总结。因为您正在编写自己的函数,也许您可以查看gtools包中MixeOrder的代码,看看该代码的哪一部分最适合您的需要。