如何在 R 中按美国国会图书馆分类 (LCC) 编号排序

Wil*_*ton 6 sorting r

国会图书馆分类号在图书馆中用于为物品提供索书号,以便在书架上订购它们。它们可以很简单,也可以非常复杂,有一些强制性部分,但有许多可选部分。(有关050 国会图书馆索书号的分解方式,请参阅“在 050 中输入索书号” ,或者参阅 lc_callnumber了解对它们进行排序的 Ruby 工具。)

我想按 R 中的 LCC 编号进行排序。我看过对R 中的非平凡元素列表进行排序对 R 中的自定义类的元素列表进行排序?但还没弄清楚。

以下是按排序顺序输入的四个索书号码:

call_numbers <- c("QA 7 H3 1992", "QA 76.73 R3 W53 2015", "QA 90 H33 2016", "QA 276.45 R3 A35 2010")
Run Code Online (Sandbox Code Playgroud)

sort按字符对它们进行排序,因此 276 < 7 < 76.73 < 90。

> sort(call_numbers)
[1] "QA 276.45 R3 A35 2010" "QA 7 H3 1992"          "QA 76.73 R3 W53 2015"  "QA 90 H33 2016"       
Run Code Online (Sandbox Code Playgroud)

为了正确地对它们进行排序,我想我必须定义一个类,然后定义它的一些方法,如下所示:

library(stringr)
class(call_numbers) <- "LCC"

## Just pick out the letters and digits for now, leave the rest
## until sorting works, then work down more levels.
lcc_regex <- '([[:alpha:]]+?) ([[:digit:]\\.]+?) (.*)'

"<.LCC" <- function(x, y) {
    x_lcc <- str_match(x, lcc_regex)
    y_lcc <- str_match(y, lcc_regex)
    if(x_lcc[2] < y_lcc[2]) return(x)
    if(as.integer(x_lcc[3]) < as.integer(y_lcc[3])) return(x)
}
"==.LCC" <- function(x, y) {
    x_lcc <- str_match(x, lcc_regex)
    y_lcc <- str_match(y, lcc_regex)
    x_lcc[2] == y_lcc[2] && x_lcc[3] == y_lcc[3]
}

">.LCC" <- function(x, y) {
    x_lcc <- str_match(x, lcc_regex)
    y_lcc <- str_match(y, lcc_regex)
    if(x_lcc[2] > y_lcc[2]) return(x)
    if(as.integer(x_lcc[3]) > as.integer(y_lcc[3])) return(x)
}
Run Code Online (Sandbox Code Playgroud)

这不会改变排序顺序。我没有定义子集方法 ( "[.myclass"),因为我不知道它应该是什么。

Wil*_*ton 1

mixedsort事实证明,从gtools包装中取出的东西就可以达到目的:

library(gtools)
call_numbers <- c("QA 7 H3 1992", "QA 76.73 R3 W53 2015", "QA 90 H33 2016", "QA 276.45 R3 A35 2010")
mixedsort(call_numbers)
## [1] "QA 7 H3 1992"          "QA 76.73 R3 W53 2015"  "QA 90 H33 2016"        "QA 276.45 R3 A35 2010"
Run Code Online (Sandbox Code Playgroud)

更远,mixedorder可用于按一列对数据框进行排序。

这是前面在如何对元素包含 R 中字母和数字的字符向量进行排序? 中回答的特殊情况。