2017-04-20 47 views
3

使用DT包中的R,我想突出顯示每行最大/最小值爲的數字數據幀。R包DT - 如何突出每行的最大數量

假設我們建立分割與5簇,然後我們想描述這些集羣具有描述性的變量:

library(DT) 
library(tidyverse) 
iris[1:6, 1:4] %>% t() 

       1 2 3 4 5 6 
Sepal.Length 5.1 4.9 4.7 4.6 5.0 5.4 
Sepal.Width 3.5 3.0 3.2 3.1 3.6 3.9 
Petal.Length 1.4 1.4 1.3 1.5 1.4 1.7 
Petal.Width 0.2 0.2 0.2 0.2 0.2 0.4 

我們希望其可視化集羣具有最高Sepal.Length,其中一個具有最高Sepal.Width等。解決方案將以每行的最大顏色顯示。

如果我使用DT包的formatStyle()函數,我可以列(最大亮點,色值,根據特定的時間間隔,...)這樣做,但我不能這樣做每行。即使我使用參數目標=「行」,整個行將被着色,不僅最大或細胞,我想。

df %>% datatable() %>% 
    formatStyle('1', background = styleEqual(max(df[,1]), 'green')) 

另一種方法是翻譯行,我datataframe列,但我更喜歡的,而不是一個有5行50列有來有50行5列的數據幀,很長的名字。

預先感謝您的幫助和建議。

回答

1

你需要爲這個自定義rowCallback功能。這裏有一個例子:

iris[1:6, 1:4] %>% datatable(options=list(rowCallback = JS(
    'function(row, data) { 
    var num_data = data.slice(1,data.length) 
    var row_max = Math.max.apply(Math,num_data); 
    var row_min = Math.min.apply(Math,num_data); 
    for(i=1;i < data.length; i++) { 
     if(data[i]==row_max) { 
     $("td:eq("+i+")", row).css("background-color", "green") 
     } else if(data[i]==row_min) { 
     $("td:eq("+i+")", row).css("background-color", "yellow") 
     } 
    } 
    }'))) 

請注意,您需要從num_data出過濾任何文本列,其中包括具有rownames第一個。

如果你想強調的第二最高值,你可以排序num_data和適應的if/else在JS代碼顏色任何你想要的。一旦num_data進行排序,num_data[num_data.length-1]爲最大,num_data[0]是分鐘,num_data [num_data.length-2]`是第二最大等

iris[1:6, 1:4] %>% datatable(options=list(rowCallback = JS(
    'function(row, data) { 
    var num_data = data.slice(1,data.length) 
    num_data.sort(function (a, b) { return a - b; }); 
    for(i=1;i < data.length; i++) { 
    if(data[i]==num_data[num_data.length-1]) { 
     $("td:eq("+i+")", row).css("background-color", "green") 
    } else if(data[i]==num_data[0]) { 
     $("td:eq("+i+")", row).css("background-color", "yellow") 
    } else if(data[i]==num_data[num_data.length-2]) { 
     $("td:eq("+i+")", row).css("background-color", "orange") 
    } 
    } 
    }'))) 
+0

有趣,我從未想到只有通過選擇行和多列的dplyr – Stedy

+0

謝謝@NicE,這真的很有幫助! 我對JS()部分(是javascript代碼?)評論,如果我還想強調的第二最高值(除最大),我想我可以像'VAR row_max2 =數學補充一下。 ....'。 也許有一種fonction,像'Math.sort.apply(數學,num_data)[2]' – demarsylvain

+0

我編輯,如果你沒有太多的行和列,您可以排序'num_data'和使用任何值在if/else中爲javascript中的單元格着色。 – NicE