Как отсортировать вектор символа, где элементы содержат буквы и числа в 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()
и получил тот же результат.
Кто-нибудь может мне помочь?
Ответы
Ответ 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
Большое спасибо! диджей