Сортировка длинного фрейма данных, как если бы он был широким - PullRequest
0 голосов
/ 24 ноября 2018

Я хочу отсортировать фрейм данных в длинном формате, как если бы он был в широком формате, но я НЕ хочу изменять структуру фрейма данных, чтобы сделать его более широким.Как этого добиться, используя инструменты tidyverse / dplyr, такие какrange, group, forcats :: fct_reorder и т. Д.

Пример: если бы данные были в широком формате, они бы выглядели так:

df1 <- data.frame(id = c("A", "B", "C"),
              col1 = c(8, 8, 7),
              col2 = c(7, 9, 3))

  id col1 col2
1  A    8    7
2  B    8    9
3  C    7    3

И я бы просто отсортировал его по col1, а затем по col2, в порядке убывания для обоих столбцов, чтобы он просто поменялся местами в первых двух строках.

Как есть, у меня это естьв длинном формате, например:

df2 <- data.frame(id = c("A", "A", "B", "B", "C", "C"),
             type = c(1, 2, 1, 2, 1, 2),
             value = c(8, 7, 8, 9, 7, 3))

  id type value
1  A    1     8
2  A    2     7
3  B    1     8
4  B    2     9
5  C    1     7
6  C    2     3

И после сортировки я хочу, чтобы она выглядела точно так:

      id type value
1  B    1     8
2  B    2     9
3  A    1     8
4  A    2     7
5  C    1     7
6  C    2     3

В словах порядка, которые я хочу отсортировать по значению типа 1сначала, и если есть связи, то посмотрите значение типа 2 для сортировки этих связей.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Использование подхода dcast() - order() - melt().

library(reshape2)
m1 <- dcast(df2, ... ~ id)
m2 <- m1[, order(-m1[2, ])]
m3 <- melt(m2, id=c("type"))
rm(m1, m2)

> m3[, c(2, 1, 3)]
  variable type value
1        B    1     8
2        B    2     9
3        A    1     8
4        A    2     7
5        C    1     7
6        C    2     3

Данные

> dput(df2)
structure(list(id = structure(c(1L, 1L, 2L, 2L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), type = c(1, 2, 1, 2, 1, 2), value = c(8, 
7, 8, 9, 7, 3)), class = "data.frame", row.names = c(NA, -6L))
0 голосов
/ 25 ноября 2018

Ниже приведен один из возможных способов сделать это.Это не очень кратко, но выполняет работу.

library(dplyr)

df2 %>%
  group_by(type) %>%
  arrange(id) %>%
  group_by(id) %>%
  mutate(
    col1 = ifelse(type == 1, value, NA),
    col1 = max(col1, na.rm = T),
    total = sum(value)
  ) %>%
  arrange(desc(col1), desc(total)) %>%
  select(id:value)

# # A tibble: 6 x 3
# # Groups:   id [3]
#   id     type value
#   <fct> <dbl> <dbl>
# 1 B         1     8
# 2 B         2     9
# 3 A         1     8
# 4 A         2     7
# 5 C         1     7
# 6 C         2     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...