1

我有这个 rpivotTable,而不是手动输入我想要排序的值,我想按数据透视表中的值排序。所以基本上当我更改左列的变量时,我想按表中的值对它们进行排序。

下面是一个可重现的例子:

library(devtools)
devtools::install_github("smartinsightsfromdata/rpivotTable")
library(rpivotTable)   

data(HairEyeColor)
rpivotTable(data = HairEyeColor, rows = "Hair",cols="Eye", vals = "Freq", aggregatorName = "Sum", rendererName = "Table", sorters = "
function(attr) { 
var sortAs = $.pivotUtilities.sortAs;
if (attr == \"Hair\") { return sortAs([\"Red\", \"Brown\", \"Blond\", \"Black\"]); }
}", width="100%", height="400px")
4

2 回答 2

0

不确定这是否是 OP 正在寻找的,但我遇到了类似的问题,对于任何试图对 rpivottable 进行排序的人来说共享解决方案可能会很有用。

我想按聚合器值排序,而不是按列/行上的变量。聚合器下拉列表旁边有两个带有小箭头的按钮,您可以单击它们来执行此操作。但是,我希望默认情况下以特定方式对表格进行排序,以便用户不必单击按钮。

我尝试了上面提到的解决方案,但这不是我想要的。分类器选项似乎对我的用例没有帮助。

如果您的表格位于某种 html 文档(rmarkdown、shiny、flexdashboard...)上,您可以使用一些 javascript 在页面加载时单击按钮。将其放置在文档中的某个位置(代码块之外)

<script>
window.addEventListener("load", function(){
  //Code inside this function will be executed after the page has been fully loaded
  document.getElementsByClassName("pvtColOrder")[0].click();
  document.getElementsByClassName("pvtColOrder")[0].click();
});
</script>

这将按列按降序对可视化进行排序(单击按钮 2 次)。如果将 [0] 更改为 [1],它将针对文档中的第二个表格,[2] 第三个表格,依此类推。“pvtRowOrder”将单击按钮来对行进行排序。

我总是将 rpivottables 放在 flexdashboard 中,因为您可以定义 css 来自定义字体、添加滚动并使表格的标题在滚动时粘在顶部,所以这个解决方案对我来说很好。

于 2020-12-30T17:57:54.773 回答
0

我遇到了您在寻找解决方案的问题,我相信我已经找到了一种方法来做您想做的事。我知道这个问题已经超过 2 年了,但希望它会被需要解决方案并被认为有帮助的人找到。

要按“vals”和另一个指标(如“cols”或“rows”)排序,需要在 sorters 函数中简单地包含另一个“if”语句。

使用开发人员提供的可重现示例作为起点:

library(rpivotTable)   
data(HairEyeColor)
rpivotTable(data = HairEyeColor, rows = "Hair",cols="Eye", vals = "Freq", aggregatorName = "Sum", rendererName = "Table", sorters = "
function(attr) { 
var sortAs = $.pivotUtilities.sortAs;
if (attr == \"Hair\") { return sortAs([\"Red\", \"Brown\", \"Blond\", \"Black\"]); }
}", width="100%", height="400px")

下一步是if (attr == '\"\"在头发颜色后的右括号后添加另一个 ) 语句。例如,假设您还想按眼睛颜色排序,首先列出的是棕色而不是蓝色。您将编写以下代码来完成此操作:

library(rpivotTable)   
data(HairEyeColor)
rpivotTable(data = HairEyeColor, rows = "Hair",cols="Eye", vals = "Freq", 
aggregatorName = "Sum", rendererName = "Table", sorters = "
function(attr) { 
var sortAs = $.pivotUtilities.sortAs;
if (attr == \"Hair\") { return sortAs([\"Red\", \"Brown\", \"Blond\", \"Black\"]);}
if (attr == \"Eye\") { return sortAs([\"Brown\", \"Blue\", \"Green\", \"Hazel\"]);}
}", width="100%", height="400px")

请记住,此包是围绕 PivotTable.js 开发的,因此您可以$.pivotUtilities.sortAs在代码中包含该函数的功能来执行其他排序,例如升序和降序。请参阅PivotTable.js 文档

于 2020-11-07T00:42:44.977 回答