订购“混合”向量(带有字母的数字)

2024-04-30

我怎样才能订购像这样的矢量

c("7","10a","10b","10c","8","9","11c","11b","11a","12") -> alph

in

alph
[1] "7","8","9","10a","10b","10c","11a","11b","11c","12"

并用它对 data.frame 进行排序,例如

V1 <- c("A","A","B","B","C","C","D","D","E","E")
V2 <- 2:1 
V3 <- alph
df <- data.frame(V1,V2,V3)

并对行进行排序以获得(先排序 V2,然后排序 V3)

 V1 V2  V3
C  1   9
A  1 10a
B  1 10c
D  1 11b
E  1  12
A  2   7
C  2   8
B  2 10b
E  2 11a
D  2 11c

> 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到(错误排序的)因素(默认)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

订购“混合”向量(带有字母的数字) 的相关文章

随机推荐