我目前在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
答案 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)