2017-09-25 48 views
1

我正在文档中使用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 

回答

0

诀窍是使用回调论点提供排序功能。这个例子中的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) 
相关问题