Nano Hash - криптовалюты, майнинг, программирование

Как отсортировать кадр данных в R по одной переменной при группировке по другим

У меня есть кадр данных:

library(tidyverse)
test_frame <- tibble(var_1 = rep(c("a", "b"), 5),
                     var_2 = c("a1", "a1", "a2", "a2", "a3", "a3", "a4", "a4", "a5", "a5"),
                     var_3 = runif(10, min = 1, max = 5))
test_frame
# A tibble: 10 x 3
   var_1 var_2 var_3
   <chr> <chr> <dbl>
 1 a     a1     4.00
 2 b     a1     4.12
 3 a     a2     2.77
 4 b     a2     1.33
 5 a     a3     3.95
 6 b     a3     3.02
 7 a     a4     2.44
 8 b     a4     2.57
 9 a     a5     1.35
10 b     a5     2.11

И я хочу, чтобы он отсортировался по var_3, но только для строк со значением «a» в var_1 таким образом, чтобы строки с одинаковым значением в var_2 были вместе. Как это:

# A tibble: 10 x 3
   var_1 var_2 var_3
   <chr> <chr> <dbl>
 1 a     a1     4.00
 2 b     a1     4.12
 5 a     a3     3.95
 6 b     a3     3.02
 3 a     a2     2.77
 4 b     a2     1.33
 7 a     a4     2.44
 8 b     a4     2.57
 9 a     a5     1.35
10 b     a5     2.11

Я безуспешно пробовал разные комбинации "group_by" и "arrange". Что мне не хватает?

23.03.2020

Ответы:


1

Одним из вариантов dplyr может быть:

test_frame %>%
 mutate(ranking = dense_rank(desc((var_1 == "a") * var_3))) %>%
 group_by(var_2) %>%
 mutate(ranking = min(ranking)) %>%
 arrange(ranking) %>%
 select(-ranking)

   var_1 var_2 var_3
   <chr> <chr> <dbl>
 1 a     a4     4.46
 2 b     a4     2.68
 3 a     a5     2.80
 4 b     a5     2.65
 5 a     a1     1.91
 6 b     a1     2.99
 7 a     a3     1.22
 8 b     a3     1.93
 9 a     a2     1.10
10 b     a2     4.92

Or:

test_frame %>%
 filter(var_1 == "a") %>%
 mutate(ranking = dense_rank(desc(var_3))) %>%
 bind_rows(test_frame %>%
            filter(var_1 == "b")) %>%
 group_by(var_2) %>%
 mutate(ranking = min(ranking, na.rm = TRUE)) %>%
 arrange(ranking) %>%
 select(-ranking)
23.03.2020

2

Используя базу R, отсортированную по значениям 'var_3', удвоенным значением 'var_2'.

with(test_frame, test_frame[order(-rep(var_3[!duplicated(var_2)], each=2)), ])
# # A tibble: 10 x 3
#    var_1 var_2 var_3
#    <chr> <chr> <dbl>
#  1 a     a4     4.79
#  2 b     a4     1.33
#  3 a     a2     3.24
#  4 b     a2     4.62
#  5 a     a5     3.06
#  6 b     a5     2.56
#  7 a     a3     1.55
#  8 b     a3     4.96
#  9 a     a1     1.47
# 10 b     a1     2.90

Данные

test_frame <- structure(list(var_1 = c("a", "b", "a", "b", "a", "b", "a", "b", 
"a", "b"), var_2 = c("a1", "a1", "a2", "a2", "a3", "a3", "a4", 
"a4", "a5", "a5"), var_3 = c(1.46994944661856, 2.89998832624406, 
3.24133098497987, 4.61612554918975, 1.55484067089856, 4.95556691568345, 
4.78667293023318, 1.32975023239851, 3.05684713739902, 2.56081386841834
)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
))
23.03.2020

3

Одним из решений является pivot_wider, поэтому вы сортируете полную переменную, затем сортируете, затем pivot_longer возвращаетесь к исходной форме.

test_frame %>%
 pivot_wider( names_from = var_1, values_from = var_3) %>%
 arrange( -a) %>%
 pivot_longer(cols=c(a,b), names_to="var_1", values_to = "var_3")

# A tibble: 10 x 3
   var_2 var_1 var_3
   <chr> <chr> <dbl>
 1 a1    a      4.21
 2 a1    b      1.82
 3 a5    a      3.71
 4 a5    b      1.25
 5 a3    a      2.76
 6 a3    b      2.58
 7 a2    a      2.60
 8 a2    b      4.32
 9 a4    a      1.12
10 a4    b      1.54
23.03.2020

4

Не нужно группировать, добавлять и удалять столбцы из вашего фрейма данных — это просто хорошее использование метода dplyr::arrange(). Я думаю, что это дает вам то, что вам нужно:

as.data.frame(test_frame) %>% arrange(var_3, var_1, var_2)

Это дает вам следующее:

    var_1 var_2    var_3
1      b    a4 1.866265
2      a    a4 2.703378
3      b    a5 2.931703
4      a    a1 2.935217
5      a    a2 3.019241
6      b    a1 3.029589
7      b    a3 3.657182
8      a    a3 4.392643
9      b    a2 4.415388
10     a    a5 4.498499

Единственная проблема в том, что var_2 сортируется «b», затем «a», а не «a», а затем «b», как вы хотели. Вероятно, есть несколько способов обойти это (вы можете использовать desc(...) в функции arrange()... но у меня были некоторые проблемы с ее работой. В конце концов, вы можете фактически отделить функции arrange(), какие действия должны сортировать каждый столбец в определенном порядке Вот мое окончательное решение для вас:

as.data.frame(test_frame) %>% arrange(var_3) %>% arrange(var_1) %>% arrange(var_2)

   var_1 var_2    var_3
1      a    a1 2.935217
2      b    a1 3.029589
3      a    a2 3.019241
4      b    a2 4.415388
5      a    a3 4.392643
6      b    a3 3.657182
7      a    a4 2.703378
8      b    a4 1.866265
9      a    a5 4.498499
10     b    a5 2.931703
23.03.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..