Сортировка по группам в rpivottable - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть rpivottable, сгенерированный с помощью этого кода благодаря пакету rpivotTable в R:

library("rpivotTable")
library("dplyr")
library("reshape2")

dane <- melt(HairEyeColor)

rpivotTable(dane,
            rows = c("Hair", "Eye"),
            cols = c("Sex"),
            vals = "value",
            aggregatorName = "Integer Sum",
            locale = "en",
            rendererName = "Table With Subtotal",
            subtotals = TRUE)

, который выглядит так:

enter image description here

Сортируется по алфавиту.И я хотел бы отсортировать его в порядке убывания, используя общую сумму значений.

Я могу попробовать вот что:

library("rpivotTable")
library("dplyr")
library("reshape2")

dane <- melt(HairEyeColor)

sorter <- paste0("function(attr) {",
                 "var sortAs = $.pivotUtilities.sortAs;",
                 "if (attr == \"Eye\") { return sortAs([\"",
                 dane %>% group_by(Eye) %>% summarise(i = sum(value)) %>% arrange(-i) %>% .$Eye %>% paste(collapse = "\", \""),
                 "\"]); }",
                 "if (attr == \"Hair\") { return sortAs([\"",
                 dane %>% group_by(Hair) %>% summarise(i = sum(value)) %>% arrange(-i) %>% .$Hair %>% paste(collapse = "\", \""),
                 "\"]); }",
                 "}")

rpivotTable(dane,
            rows = c("Hair", "Eye"),
            cols = c("Sex"),
            vals = "value",
            aggregatorName = "Integer Sum",
            locale = "en",
            rendererName = "Table With Subtotal",
            subtotals = TRUE,
            sorters = sorter)

Чем я получу это:

enter image description here

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

enter image description here

Возможно ли это в пакете rpivotTable?

1 Ответ

0 голосов
/ 14 августа 2019

Я могу узнать больше из вашего вопроса, чем вы узнаете из моего ответа, потому что мне понравилось ваше умное смешение dplyr и JavaScript.Чтобы подтвердить вашу проблему, вы указываете один список сортировки Eye в вашей функции сортировки, но вы действительно хотите другой список сортировки Eye в зависимости от группировки волос.Итак, ваш список сортировки Eye:

library("dplyr")
library("reshape2")

dane <- melt(HairEyeColor)
dane %>% group_by(Eye) %>% summarise(i = sum(value)) %>% 
   arrange(-i) %>% .$Eye %>% paste(collapse = "\", \"")

... имеет следующий вывод:

"Brown\", \"Blue\", \"Hazel\", \"Green"

... и это тот же порядок сортировки, который используется в каждый Hairгруппировка.См. Также этот ответ .

Я не эксперт в области сводных таблиц, но для того, чтобы делать то, что вы хотите, я думаю, что функция сортировщика должна обрабатывать два атрибута, таких как [\"Hair\", \"Eye\"], а нетолько один.Я полагаю, что выражение dplyr, подобное этому, приведет вас к правильному получающемуся двумерному списку:

dane %>% group_by(Hair, Eye) %>% 
  summarise(hairEyeSum = sum(value)) %>% 
  ungroup() %>% 
  arrange( desc(hairEyeSum)) %>% 
  group_by( Hair) %>% 
  mutate( hairSum = sum(hairEyeSum)) %>% 
  arrange( desc(hairSum), desc(hairEyeSum)) %>%
  ungroup() %>% 
  transmute( hairEyeList = paste0( "[\"", Hair, "\",\"", Eye, "\"]")) 

Вывод:

# A tibble: 16 x 1
   hairEyeList            
   <chr>                  
 1 "[\"Brown\",\"Brown\"]"
 2 "[\"Brown\",\"Blue\"]" 
 3 "[\"Brown\",\"Hazel\"]"
 4 "[\"Brown\",\"Green\"]"
 5 "[\"Blond\",\"Blue\"]" 
 6 "[\"Blond\",\"Green\"]"
 7 "[\"Blond\",\"Hazel\"]"
 8 "[\"Blond\",\"Brown\"]"
 9 "[\"Black\",\"Brown\"]"
10 "[\"Black\",\"Blue\"]" 
11 "[\"Black\",\"Hazel\"]"
12 "[\"Black\",\"Green\"]"
13 "[\"Red\",\"Brown\"]"  
14 "[\"Red\",\"Blue\"]"   
15 "[\"Red\",\"Hazel\"]"  
16 "[\"Red\",\"Green\"]" 

Но мне не удалось заставить работать функцию сортировщика.

...