R: Сортировка всех столбцов в фрейме данных по буквенно-цифровому столбцу - PullRequest
0 голосов
/ 24 октября 2019

Я хочу отсортировать все столбцы фрейма данных в R по столбцу, содержащему буквенно-цифровые данные. Вот пример фрейма данных:

R> dd <- data.frame(b = c("Hi", "Med", "Hi", "Low"),
                 x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
                 z = c("A1", "A3", "A10", "A2"))

1   Hi  A   8   A1
2   Med D   3   A3
3   Hi  A   9   A10
4   Low C   9   A2

Я бы хотел отсортировать весь фрейм данных по столбцу z. Желаемый результат выглядит следующим образом: информация по столбцам остается согласованной:

1   Hi  A   8   A1
2   Low C   9   A2
3   Med D   3   A3
4   Hi  A   9   A10

Вот методы, которые я пробовал до сих пор, но они не сработали:

Метод 1: неправильно отсортирована «A10»

R> dd<- dd[with(dd, order(z)), ]
R> View(dd)
1   Hi  A   8   A1
4   Hi  A   9   A10
2   Low C   9   A2
3   Med D   3   A3

Метод 2 : сортировка не выполнена

R> library(gtools)
R> dd$z = factor(dd$z, levels = gtools::mixedsort(dd$z))
R> View(dd)
1   Hi  A   8   A1
2   Med D   3   A3
3   Hi  A   9   A10
4   Low C   9   A2

Метод 3: сортировка не выполнена

R> library(stringr);
R> dd$z = factor(dd$z, levels = str_sort(dd$z, numeric=TRUE))
R> View(dd)
1   Hi  A   8   A1
2   Med D   3   A3
3   Hi  A   9   A10
4   Low C   9   A2

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Я нашел решение, которое последовательно работает для предоставленного примера и моих реальных данных. Спасибо @rawr за понимание. Когда я создаю или загружаю данные, я должен установить для параметра stringAsFactors значение false.

R> dd <- data.frame(b = c("Hi", "Med", "Hi", "Low"),
                 x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
                 z = c("A1", "A3", "A10", "A2"), stringsAsFactors = F)
R> dd

    b x y   z
1  Hi A 8  A1
2 Med D 3  A3
3  Hi A 9 A10
4 Low C 9  A2

R> library(gtools)
R> dd <- dd[gtools::mixedorder(dd$z), ]
R> dd

    b x y   z
1  Hi A 8  A1
4 Low C 9  A2
2 Med D 3  A3
3  Hi A 9 A10
1 голос
/ 24 октября 2019

Вот вариант с mixedorder

library(dplyr)
dd <- dd %>% 
         arrange(gtools::mixedorder(z))
dd
#   b x y   z
#1  Hi A 8  A1
#2 Low C 9  A2
#3 Med D 3  A3
#4  Hi A 9 A10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...