【问题标题】:Sort null values last with DataTables in R最后使用 R 中的 DataTables 对空值进行排序
【发布时间】:2018-03-06 23:29:09
【问题描述】:

我目前在rmarkdown 文档中使用datatable 来创建flexdashboard。我有一个带有 NA 的数字列。当我单击以按降序对列进行排序时,它将最大值放在第一位,NA/null 值放在最后。当我按升序排序时,它首先放置 NA/null 值,然后是数值。有没有办法在按升序排序时对空值进行最后排序?对于这个问题,看起来DataTables 可能有一个plugin,但我看到它是R DataTables 版本的not supported。我希望能够像 RStudio 在您查看表格时对表格进行排序一样对数字列进行排序。

这是我正在寻找的功能的可重现示例:

library(DT)
library(tidyverse)


Table.with.null <- tibble(Category=c("A","B","C","D"),
                          Numeric=seq(1,4),
                          Numeric.null=c(1,2,3,NA))

datatable(Table.with.null,rownames=FALSE)

当我以升序顺序对Numeric.null 列进行排序时,表格应如下所示:

Category  Numeric  Numeric.null
A         1        1
B         2        2
C         3        3
D         4        NA

它的作用。当我按降序顺序对Numeric.null 列进行排序时,表格应如下所示:

Category  Numeric  Numeric.null
C         3        3
B         2        2
A         1        1
D         4        NA

【问题讨论】:

标签: r datatables dt flexdashboard


【解决方案1】:

诀窍是使用 callback 参数提供排序功能。示例中的 js 函数对我不起作用(我想应该提供 value 参数 - 它需要一些工作),但这里是我自己的排序函数的示例。

重要的一点是,在调用datatable 函数之前,应该将排序列类型更改为字符。还要记住,虽然 rownames DT 参数设置为 FALSE 列有数字 0,1,2,...

library(DT)
library(dplyr)

temp <-mtcars
temp[1, "wt"] <- NA
temp[2, "wt"] <- NA

#OUTPUT - dtdata
DT::datatable({
  temp %>% mutate(wt = as.character(wt))
},
callback = JS("
  $.fn.dataTableExt.oSort['NumericOrBlank-asc'] = function(x,y) {
    var retVal;
        if( x === '' || $.isEmptyObject(x)) x = 1000;
    if( y === '' || $.isEmptyObject(y)) y = 1000;
    x = (x = parseFloat($.trim(x).replace(/,/g,''))) ? x : 0;
    y = (y = parseFloat($.trim(y).replace(/,/g,''))) ? y : 0;
    if (x==y) retVal= 0; 
    else retVal = (x>y) ? 1 : -1; 
    return retVal;
  };
  $.fn.dataTableExt.oSort['NumericOrBlank-desc'] = function(y,x) {
  var retVal;
  x = (x = parseFloat($.trim(x).replace(/,/g,''))) ? x : 0;
  y = (y = parseFloat($.trim(y).replace(/,/g,''))) ? y : 0;
  if (x==y) retVal= 0; 
  else retVal = (x>y) ? 1 : -1; 
  return retVal;
  };
  "),
options = list(
  autoWidth = TRUE,
  aoColumnDefs = list(list(width = '100px', bSortable = TRUE, sType = 
'NumericOrBlank', targets = c(5)))
), rownames = FALSE)

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2017-07-26
    • 2022-01-20
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多