предположим, это то, что 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 остальной части моего кода.
Это можно легко сделать с помощью 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
@Mathica Можете ли вы показать значения unique(df1$grp)
@Mathica Вы назначили вывод обратно другому объекту или тому же объекту, т.е. df2 <- df1 %>% arrange(readr::parse_number(grp))
это "<2" "2-6" "21-27" "28-35" "36-50" "7-20" "51+"
Хорошо, в конце есть +
, это может быть проблемой
@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+"
, вроде работает нормально
Я передал это напрямую остальной части моего кода! видимо, мне пришлось назначить его другому объекту и использовать последний для остальной части моего кода, как вы предложили. ты классный акрун! спасибо
вы можете указать желаемые уровни (и принудительный порядок рангов) также с помощью базы 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
спасибо за предложение dplyr. поэтому мой фактический фрейм данных очень похож на мой небольшой пример, просто больше строк и столбцов. оба являются кадрами данных, столбец grp возвращает символ при приеме str(). но я не знаю, почему ваше классное предложение работает для этого, а не для моего фактического фрейма данных. есть идеи, что проверить?