Подтвердить что ты не робот

Как отсортировать вектор символа, где элементы содержат буквы и числа в R?

У меня есть массив символов

cf <- c("V440","V457","V116","V327","V446","V108",
         "V155","V217","V120","V51","V477")

Я хотел бы сортировать его в порядке убывания, так что у меня будет такой вывод:

V51
V108
V116
V120
V155
V217
V327
V440
V446
V457
V477

Я пробовал sort.list() как этот

cf[sort.list(cf)]

и получил этот ответ:

[1] "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477" "V51" 

а также попробовал order() и получил тот же результат.

Кто-нибудь может мне помочь?

4b9b3361

Ответ 1

Попробуйте mixedsort из пакета "gtools":

> # install.packages("gtools") ## Uncomment if not already installed
> library(gtools)
> mixedsort(cf)
 [1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477"

Если вы не хотите использовать mixedsort (не знаете, почему этого не будет), и если ваш вектор имеет довольно согласованный шаблон (например, буквы, за которыми следуют цифры), вы также можете попробовать что-то вроде этого. (Примечание: Относительно непроверено.)

newvec <- c("V440", "V457", "V116", "V327", "V446", "V108", "V155", 
            "V217", "V120", "V51", "V477", "B22", "A10", "Z01")

newvec[order(gsub("([A-Z]+)([0-9]+)", "\\1", newvec), 
             as.numeric(gsub("([A-Z]+)([0-9]+)", "\\2", newvec)))]
#  [1] "A10"  "B22"  "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440"
# [11] "V446" "V457" "V477" "Z01" 

Ответ 2

Здесь много правильных ответов, это еще один способ, просто для удовольствия.

cf[order(nchar(cf), cf)]
# [1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477"

Ответ 3

Еще одно решение в строке кода с использованием функции str_sort (из stringr stringr.)

# install.packages("stringr") ## Uncomment if not already installed
library(stringr)

str_sort(cf, numeric = TRUE)

[1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477"

Ответ 4

Просто соберите предыдущий символ "V", чтобы построить вектор сортировки. Никаких дополнительных причудливых инструментов не требуется.

vals <- as.numeric(gsub("V","", cf))
cf[order(vals)]

[1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446"
[10] "V457" "V477"

Ответ 5

R правильно упорядочивает строки по алфавиту, поэтому вы получаете этот результат.

Помимо @Ananda очень хороший ответ, если вы хотите использовать базовую R, вы можете использовать strsplit для удаления "V" из каждой строки, а затем использовать as.numeric для преобразования строк в целые числа:

vals <- as.numeric(sapply(cf, FUN=function(x){strsplit(x, "V")[[1]][2]}))

Теперь вы можете отсортировать строки, используя vals

cf[order(vals)]

Ответ 6

Здесь базовый подход с использованием names и sort (Ананда был довольно гладким):

cf <- c("V440","V457","V116","V327","V446","V108",
         "V155","V217","V120","V51","V477")

cf2 <- as.numeric(gsub("[^[:digit:]]", "", cf))
names(cf2) <- seq_along(cf2)
cf[as.numeric(names(sort(cf2)))]

## > cf[as.numeric(names(sort(cf2)))]
##  [1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327"
##  [8] "V440" "V446" "V457" "V477"

Ответ 7

У меня похожая проблема, но я бы хотел отсортировать "буквы, сопровождаемые цифрами", по номерам, используя только R.

В настоящее время у меня есть этот тип символьного массива:

> [1] A242N-H    A254N-H    A270N-H    A290N-H    A295N-H    A309N-H   
> [7] A310N-H    A322N-H    A329N-H    A331N-H    A368N-H    A375N-H   
> [13] Assignment C217N-H    C247N-H    C284N-H    C289N-H    C344N-H   
> [19] C354N-H    D194N-H    D196N-H    D224N-H    D232N-H    D260N-H   
> [25] D268N-H    D314N-H    D316N-H    D328N-H    D339N-H    D346N-H

... но я хотел бы иметь это:

> [1] Assignment I188N-H    L189N-H    R190N-H    Y191N-H    L192N-H    
> [7] M193N-H    D194N-H    D196N-H    T197N-H    F198N-H    T199N-H    
> [13] N201N-H    F202N-H    N203N-H    N204N-H    L207N-H    R212N-H   
> [19] Q213N-H    T214N-H    Y215N-H    L216N-H    C217N-H    Y218N-H   
> [25] E219N-H    V220N-H    E221N-H    R222N-H    L223N-H    D224N-H   
> [31] N225N-H    G226N-H    T227N-H    W228N-H    V229N-H    L230N-H

Большое спасибо! диджей