gpt4 book ai didi

r - 使混合排序区分大小写? [r]

转载 作者:行者123 更新时间:2023-12-02 00:05:36 29 4
gpt4 key购买 nike

我正在尝试按自然顺序对字符向量进行排序(就像人类排序一样),但要考虑大小写差异。例如,在下面的向量中,我想独立地对所有小“m”和大“M”进行排序。

x<- c("m10", "M10", "m11", "m12", "m2", "M2", "m3", "M3", "m4", "M4", "yo1", "yo2")

所以它看起来像:

  DesiredSort(x)

[1] "M2" "M3" "M4" "M10" "m2" "m3" "m4" "m10" "m11" "m12" "yo1" "yo2"

来自 here我知道了如何使 sort 考虑大小写:

sortC <- function(...) {
a <- Sys.getlocale("LC_COLLATE")
on.exit(Sys.setlocale("LC_COLLATE", a))
Sys.setlocale("LC_COLLATE", "C")
sort(...)
}
sortC(x)

[1] "M10" "M2" "M3" "M4" "m10" "m11" "m12" "m2" "m3" "m4" "yo1" "yo2"

但这并没有给出自然顺序。我知道 gtools 的 mixedsort 会正确地将 m2 放在 m10 之前,这样:

mixedsort(x)

[1] "m2" "M2" "m3" "M3" "m4" "M4" "m10" "M10" "m11" "m12" "yo1" "yo2"

但是 mixedsort 特别忽略了字符串的大小写,所以做类似 SortC 的功能是行不通的。

我有几个向量可以按这种方式排序,它们包含示例中未包含的字符,因此最好能找到一种通用的排序方式。

想法?也许我缺少一些明显的东西。谢谢。

最佳答案

您需要解决方案的通用性如何?下面的自定义解决方案适合您的数据集,但您并不完全清楚(至少对我而言)在包含任意字符串的向量的一般情况下您想发生什么。

DesiredSort <- function(x)
{
library(stringr)

locale <- Sys.getlocale("LC_COLLATE")
on.exit(Sys.setlocale("LC_COLLATE", locale))
Sys.setlocale("LC_COLLATE", "C")

x_matches <- str_match(x, "(^[[:alpha:]]+)([[:digit:]]+)")[, 2:3]

x_data <- data.frame(
letter = x_matches[, 1],
number = as.numeric(x_matches[, 2])
)
o <- with(x_data, order(letter, number))
x[o]
}

x <- c("m10", "M10", "m11", "m12", "m2", "M2", "m3", "M3", "m4", "M4", "yo1", "yo2")
expected <- c("M2", "M3", "M4", "M10", "m2", "m3", "m4", "m10", "m11", "m12", "yo1", "yo2")
stopifnot(identical(DesiredSort(x), expected))

关于r - 使混合排序区分大小写? [r],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18572555/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com