2017-09-25 85 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) 
相關問題