使用R中的DataTables对空值进行排序
问题描述:
我正在文档中使用datatable
创建flexdashboard
。我有一个带有NA的数字列。当我按降序对列进行排序时,它会将最大值放在首位,并将NA /空值放在最后。当我按升序排序时,它首先放置NA /空值,然后放置数值。当按升序排序时,有没有办法对最后的空值进行排序?它看起来像DataTables
可能有一个plugin这个问题,但我看到它是not supported由R数据表版本。我希望能够按照RStudio在查看表格时对数字列进行排序。使用R中的DataTables对空值进行排序
这里是我要找的功能重复的例子:
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
答
诀窍是使用回调论点提供排序功能。这个例子中的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)