> library(gtools)
> mixedsort(alph)
[1] "7" "8" "9" "10a" "10b" "10c" "11a" "11b" "11c" "12"
对您使用的 data.frame 进行排序mixedorder
instead
> 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
, since 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
means concat,即从许多短向量中生成一个长向量,但在您的情况下,您只有一个向量(19:10
)所以不需要连接任何东西。然而,在以下情况下V1
你有 10 个长度为 1 的向量,所以你需要像你已经做的那样进行连接。
- 你需要
stringsAsFactors=FALSE
不转换V1
and V3
到(错误排序的)因素(默认)。