最后使用R中的DataTables对空值进行排序

时间:2017-09-25 21:41:30

标签: r datatables dt flexdashboard

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

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

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

1 个答案:

答案 0 :(得分:1)

诀窍是使用回调参数提供排序功能。示例中的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)