Переупорядочивание буквенно-цифровой возрастной группы в R

предположим, это то, что R дает мне.

df1 = data.frame(grp = c("<2", "2-5", "21-26","27-32","6-10"), val= rep(0,5))
     grp val
1    <2   0
2   2-5   0
3 21-26   0
4 27-32   0
5  6-10   0

но я хочу, чтобы R понял 6 < 21 и дал:

df2 = data.frame(grp = as.factor(c("<2", "2-5", "6-10", "21-26", "27-32")), val= rep(0,5))
    grp val
1    <2   0
2   2-5   0
3  6-10   0
4 21-26   0
5 27-32   0

Я попробовал смешанную сортировку () из gtools, но она возвращает индексы вместо переупорядоченного кадра данных. любые советы или идеи, как добраться до этого?

редактировать. Благодаря замечательному @akrun я понял, что должен сначала назначить его предложенный dplyr ответ другому объекту, скажем, new_df, а затем передать new_df остальной части моего кода.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
0
28
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это можно легко сделать с помощью parse_number, чтобы изменить порядок строк с помощью arrange.

library(dplyr)
df1 %>%
   arrange(readr::parse_number(grp))

-выход

    grp val
1    <2   0
2   2-5   0
3  6-10   0
4 21-26   0
5 27-32   0

Или с помощью base R

df1[do.call(order, read.csv(text = gsub("<", "-Inf,", 
    chartr("-", ",", df1$grp)), header = FALSE)),]
    grp val
1    <2   0
2   2-5   0
5  6-10   0
3 21-26   0
4 27-32   0

спасибо за предложение dplyr. поэтому мой фактический фрейм данных очень похож на мой небольшой пример, просто больше строк и столбцов. оба являются кадрами данных, столбец grp возвращает символ при приеме str(). но я не знаю, почему ваше классное предложение работает для этого, а не для моего фактического фрейма данных. есть идеи, что проверить?

Mathica 10.04.2022 19:06

@Mathica Можете ли вы показать значения unique(df1$grp)

akrun 10.04.2022 19:07

@Mathica Вы назначили вывод обратно другому объекту или тому же объекту, т.е. df2 <- df1 %>% arrange(readr::parse_number(grp))

akrun 10.04.2022 19:10

это "<2" "2-6" "21-27" "28-35" "36-50" "7-20" "51+"

Mathica 10.04.2022 19:11

Хорошо, в конце есть +, это может быть проблемой

akrun 10.04.2022 19:12

@Mathica, с которой я пробовал df2 = data.frame(grp = c("<2", "2-5", "21-27","28-35","36-50", "51+", "6-10"), val= rep(0,7));df2 %>% arrange(readr::parse_number(grp)) %>% pull(grp)# [1] "<2" "2-5" "6-10" "21-27" "28-35" "36-50" "51+", вроде работает нормально

akrun 10.04.2022 19:14

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

Mathica 10.04.2022 19:14

вы можете указать желаемые уровни (и принудительный порядок рангов) также с помощью базы R:

grp <- factor(c("<2", "2-5", "6-10", "21-26", "27-32"),
       levels = c("<2", "2-5", "6-10", "21-26", "27-32"),
       ordered = TRUE
       )

обратите внимание на использование factor, а не as.factor в этом случае

Не уверен, что это именно то, что вы ищете, но если у вас есть необработанный набор чисел, из которого вы создаете фрейм данных, вы также можете просто использовать cut() для создания упорядоченного фактора, который объединяет ваши данные, а затем table() для подсчета частоты в пределах каждого диапазона среза.

set.seed(100)
observations <- rnorm(20, 5, 5)
cut(observations, c(0, 2, 9, 10), include.lowest = T) |>
  table() |>
  data.frame()

#     Var1 Freq
# 1  [0,2]    2
# 2  (2,9]   16
# 3 (9,10]    1

Другие вопросы по теме