Dplyr: условно ранжировать столбец на основе условия другого?

Привет, предположим, у меня есть такая таблица. Я хочу ранжировать по «процентам», однако я хочу, чтобы он основывался только на том, когда столбец кошки находится в группе «ВЫСОКИЙ» и игнорирует «НИЗКИЙ».

       name  cat Freq percent
1     berry HIGH  259   0.583
2      jack HIGH   45   0.634
3     steve HIGH  331   0.943
4     nadia HIGH  304   0.580
5     jacob HIGH  179   0.844
6     susan HIGH   15   0.833
7  luthered HIGH   14   0.264
8      jane HIGH   99   0.513
9     berry  LOW  185   0.417
10     jack  LOW   26   0.366
11    steve  LOW   20   0.057
12    nadia  LOW  220   0.420
13    jacob  LOW   33   0.156
14    susan  LOW    3   0.167
15 luthered  LOW   39   0.736
16     jane  LOW   94   0.487

Я пытался сделать это, но я не могу заставить условие работать.

temp = structure(list(name = c("berry", "jack", "steve", "nadia", "jacob", 
"susan", "luthered", "jane", "berry", "jack", "steve", "nadia", 
"jacob", "susan", "luthered", "jane"), cat = c("HIGH", "HIGH", 
"HIGH", "HIGH", "HIGH", "HIGH", "HIGH", "HIGH", "LOW", "LOW", 
"LOW", "LOW", "LOW", "LOW", "LOW", "LOW"), Freq = c(259L, 45L, 
331L, 304L, 179L, 15L, 14L, 99L, 185L, 26L, 20L, 220L, 33L, 3L, 
39L, 94L), percent = c(0.583, 0.634, 0.943, 0.58, 0.844, 0.833, 
0.264, 0.513, 0.417, 0.366, 0.057, 0.42, 0.156, 0.167, 0.736, 
0.487)), class = "data.frame", row.names = c(NA, -16L))

Я пытался сделать это, но порядок не правильный.

temp %>% arrange(desc ( percent), cat =="HIGH" )

если это правильно заказано, имя должно быть заказано как таковое: Стив Джейкоб Сьюзен Джек ягода Надя Джейн лютерировал

заранее спасибо.

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы 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.
1
0
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Мы можем использовать

temp %>% 
   arrange(replace(rep(n() + 1, n()), cat == "HIGH", 
      dense_rank(-percent[cat == "HIGH"])))

Или также может использовать

temp %>%
  group_by(cat) %>% 
  group_modify(~ .x %>%
  arrange(if(.y$cat == "HIGH") desc(percent) else n() + 1 )) %>%
  ungroup

-выход

# A tibble: 16 × 4
   cat   name      Freq percent
   <chr> <chr>    <int>   <dbl>
 1 HIGH  steve      331   0.943
 2 HIGH  jacob      179   0.844
 3 HIGH  susan       15   0.833
 4 HIGH  jack        45   0.634
 5 HIGH  berry      259   0.583
 6 HIGH  nadia      304   0.58 
 7 HIGH  jane        99   0.513
 8 HIGH  luthered    14   0.264
 9 LOW   berry      185   0.417
10 LOW   jack        26   0.366
11 LOW   steve       20   0.057
12 LOW   nadia      220   0.42 
13 LOW   jacob       33   0.156
14 LOW   susan        3   0.167
15 LOW   luthered    39   0.736
16 LOW   jane        94   0.487

Или если «кошка» должна быть заказана на основе «процентных» значений, которые соответствуют «ВЫСОКОМУ»

temp %>% 
  arrange(factor(name, levels = unique(name[cat == "HIGH"
      ][order(dense_rank(-percent[cat == "HIGH"]))])))

-выход

       name  cat Freq percent
1     steve HIGH  331   0.943
2     steve  LOW   20   0.057
3     jacob HIGH  179   0.844
4     jacob  LOW   33   0.156
5     susan HIGH   15   0.833
6     susan  LOW    3   0.167
7      jack HIGH   45   0.634
8      jack  LOW   26   0.366
9     berry HIGH  259   0.583
10    berry  LOW  185   0.417
11    nadia HIGH  304   0.580
12    nadia  LOW  220   0.420
13     jane HIGH   99   0.513
14     jane  LOW   94   0.487
15 luthered HIGH   14   0.264
16 luthered  LOW   39   0.736

О, я вижу; можно ли сделать так, чтобы имена были прямо друг под другом, например теперь стив первый. Можно ли отсортировать так, чтобы это были Стив, Стив, Джейкоб, Джейкоб и т. д.

Ahdee 22.04.2022 20:40

@Ahdee Меня немного смущает ваше описание I only want it based on when the cat column is "HIGH" group and ignore the "LOW" Если это так, обновленное должно работать. В комментариях ваше описание кажется другой логикой

akrun 22.04.2022 20:43

@Ahdee Можете ли вы проверить обновленный пост. Я добавил новое решение на основе ваших комментариев. Непонятно, что ожидается

akrun 22.04.2022 20:55

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