Encomende um vetor “misto” (números com letras)

Como posso pedir um vetor como

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

dentro

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

e usá-lo para classificar um data.frame, como

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

e ordenar a linha para obter (ordem V2 e depois 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" 

Para classificar um data.frame você usa mixedorder invés

 > 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 em múltiplos vetores (colunas)

Aparentemente, o mixedorder não pode lidar com vários vetores. Fiz uma function que contorna isso convertendo todos os vetores de caractere em fatores com níveis ordenados sortidos e passando todos os vetores para a function de order padrão.

 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) )) } 

No entanto, no seu caso particular, o multi.mixedorder o mesmo resultado que o order padrão, uma vez que V2 é numérico.

 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 

Notar que

  • 19:10 é equivalente a c(19:10) . c significa concat , ou seja, fazer um vetor longo de muitos curtos, mas no caso de você ter apenas um vetor ( 19:10 ), não há necessidade de concatenar nada. No entanto, no caso de V1 você tem 10 vetores de comprimento 1, então você precisa conciliar, como você já faz.
  • Você precisa de stringsAsFactors=FALSE para não converter V1 e V3 em fatores (classificados incorretamente) (que é o padrão).