R: как отсортировать вектор с помощью специального метода сравнения - PullRequest
0 голосов
/ 28 февраля 2020

Я искал решение, но пока не нашел. Я видел, что многие люди задавали такие вопросы, но не получил ни одного ответа или ответов, которые не работают для меня.

Предположим, у меня есть вектор, как показано в кодах ниже, и я отсортирую его с помощью функции сортировки R, я получу результат с g10 в качестве второго элемента вместо последнего элемента. Итак, я ищу способ предоставить свою функцию сравнения для функции сортировки, поэтому функция сортировки вызовет мою функцию для сравнения двух элементов, чтобы определить их порядок (например, когда моя функция вызывается с помощью «g10»). , 'g2' в качестве аргументов, моя функция может разделять каждый аргумент на буквы и цифры, сравнивать буквы и цифры отдельно и возвращать -1, 0 или 1 согласно моим собственным правилам). Такая функция доступна на многих других языках, таких как c, Perl, et c. Я ценю, если вы можете привести пример рабочих кодов с моим вектором, если вы знаете способ. Спасибо.

> groups <- c('g10', 'g2', 'g5', 'g9', 'g4', 'g8', 'g1', 'g3', 'g6', 'g7')
> groups <- sort(groups)
> groups
 [1] "g1"  "g10" "g2"  "g3"  "g4"  "g5"  "g6"  "g7"  "g8"  "g9"

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Вот базовое решение R, использующее order + gsub, то есть

r <- groups[order(as.numeric(gsub("\\D","",groups)))]

, такое что

> r
 [1] "g1"  "g2"  "g3"  "g4"  "g5"  "g6"  "g7"  "g8"  "g9" 
[10] "g10"
0 голосов
/ 28 февраля 2020

Я думаю, вам нужна функция типа sort_by в пакете funprog.

library(stringr)
library(funprog)

f <- function(x) as.numeric(str_extract(x, "\\d+"))

groups <- c('g10', 'g2', 'g5', 'g9', 'g4', 'g8', 'g1', 'g3', 'g6', 'g7')

sort_by(groups, f)
# [1] "g1"  "g2"  "g3"  "g4"  "g5"  "g6"  "g7"  "g8"  "g9"  "g10"

Здесь она сортирует groups по номерам, содержащимся в каждой группе. Вы можете указать несколько функций для sort_by:

f1 <- function(x) str_extract(x, "^[a-z]+")
f2 <- function(x) as.numeric(str_extract(x, "\\d+"))

groups <- c('g10', 'a2', 'f5', 'g9', 'g4', 'b8', 'c1', 'b3', 'a6', 'c17')

sort_by(groups, f1, f2)
# [1] "a2"  "a6"  "b3"  "b8"  "c1"  "c17" "f5"  "g4"  "g9"  "g10"

Здесь данные сортируются по «префиксам», а затем по номерам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...