> library(gtools)
> mixedsort(alph)
[1] "7" "8" "9" "10a" "10b" "10c" "11a" "11b" "11c" "12"
要对 data.frame 进行排序,请改用 mixedorder
> mydf <- data.frame(alph, USArrests[seq_along(alph),])
> mydf[mixedorder(mydf$alph),]
alph Murder Assault UrbanPop Rape
Alabama 7 13.2 236 58 21.2
California 8 9.0 276 91 40.6
Colorado 9 7.9 204 78 38.7
Alaska 10a 10.0 263 48 44.5
Arizona 10b 8.1 294 80 31.0
Arkansas 10c 8.8 190 50 19.5
Florida 11a 15.4 335 80 31.9
Delaware 11b 5.9 238 72 15.8
Connecticut 11c 3.3 110 77 11.1
Georgia 12 17.4 211 60 25.8
mixedorder 在多个向量(列)上
显然mixedorder 无法处理多个向量。我创建了一个函数,通过将所有字符向量转换为具有混合排序级别的因子,并将所有向量传递给标准order 函数来规避这一点。
multi.mixedorder <- function(..., na.last = TRUE, decreasing = FALSE){
do.call(order, c(
lapply(list(...), function(l){
if(is.character(l)){
factor(l, levels=mixedsort(unique(l)))
} else {
l
}
}),
list(na.last = na.last, decreasing = decreasing)
))
}
但是,在您的特定情况下,multi.mixedorder 会得到与标准 order 相同的结果,因为 V2 是数字。
df <- data.frame(
V1 = c("A","A","B","B","C","C","D","D","E","E"),
V2 = 19:10,
V3 = alph,
stringsAsFactors = FALSE)
df[multi.mixedorder(df$V2, df$V3),]
V1 V2 V3
10 E 10 12
9 E 11 11a
8 D 12 11b
7 D 13 11c
6 C 14 9
5 C 15 8
4 B 16 10c
3 B 17 10b
2 A 18 10a
1 A 19 7
请注意
-
19:10 等价于 c(19:10)。 c 表示 concat,即从许多短向量中生成一个长向量,但在您的情况下,您只有一个向量 (19:10),因此无需连接任何内容。但是,在 V1 的情况下,您有 10 个长度为 1 的向量,因此您需要像之前那样进行连接。
- 您需要
stringsAsFactors=FALSE 才能不将V1 和V3 转换为(排序错误的)因子(这是默认值)。