2

rpivotTable由于package in ,我有一个使用此代码生成的 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)

看起来像这样:

在此处输入图像描述

它按字母顺序排序。我想使用值的总和按降序对其进行排序。

我可以这样尝试:

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)

比我得到这个:

在此处输入图像描述

这是按“外部”组排序的。我想让它按两个组排序,如下所示:

在此处输入图像描述

可以rpivotTable打包吗?

4

1 回答 1

0

我可能从你的问题中学到的东西比你从我的答案中学到的更多,因为我喜欢你巧妙地混合 dplyr 和 JavaScript。为了重申您的问题,您在排序器函数中指定了一个眼睛排序列表,但您确实需要一个不同的眼睛排序列表,具体取决于头发分组。所以你的眼睛排序列表:

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\", \"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\"]" 

但是我没有让分拣机功能正常工作。

于 2019-08-14T19:18:22.897 回答