1

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

v1<- c("p 1", "p 2", "p 10", "p 11")

使用排序它sort(v1)给了我

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

但是,我想要 sort(v1)

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

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

4

2 回答 2

4

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

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"
于 2013-03-21T16:05:55.790 回答
4

您可以查看代码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 ) ]

或者您可以通过编写一个方法xtfrm并为您的向量提供适当的类来自动执行此操作:

xtfrm.mixed <- function(x) {
    tmp <- strsplit(x, ' +')
    tmp1 <- sapply(tmp, '[[', 1)
    tmp2 <- as.numeric(sapply(tmp, '[[', 2))
    tmp3 <- rank(tmp1, ties.method='min')
    tmp4 <- rank(tmp2, ties.method='min')
    tmp3+tmp4/(max(tmp4)+1)
}

class(v1) <- 'mixed'
sort(v1)

如果您的所有数据都以“p”开头,那么您可以将其剥离并强制转换为数字并使用 in order

于 2013-03-21T19:35:45.053 回答