2016-06-27 2 views
5

У меня есть data.frame с одним столбцом ID и несколькими числовыми столбцами, количество числовых столбцов может отличаться. Из этих числовых столбцов я хочу покрасить все значения выше среднего значения столбца, а все значения ниже столбца означают красный. Код ниже дает мой желаемый результат, но это не общий код для фреймов данных с более или менее числовыми столбцами.formatStyle через несколько столбцов DT R

library(DT) 

data2 <- cbind(ID = "some ID",iris[,1:4]) 

    datatable(
     data2, rownames = FALSE, class = 'cell-border stripe', 
     options = list(
     dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')) 
    ) 
) %>% 
    formatStyle(colnames(data)[2], backgroundColor = styleInterval(mean(data[,2]), c("red","green"))) %>% 
    formatStyle(colnames(data)[3], backgroundColor = styleInterval(mean(data[,3]), c("red","green"))) %>% 
    formatStyle(colnames(data)[4], backgroundColor = styleInterval(mean(data[,4]), c("red","green"))) %>% 
    formatStyle(colnames(data)[5], backgroundColor = styleInterval(mean(data[,5]), c("red","green"))) 

Я бы хотел заменить приведенный выше код ниже, но это не сработает. Код ниже также будет работать, когда число числовых столбцов изменится.

datatable(
    data2, rownames = FALSE, class = 'cell-border stripe', 
    options = list(
    dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')) 
) 
) %>% 
    formatStyle(colnames(data2)[2:ncol(data2)], backgroundColor = styleInterval(colMeans(data2[,2:ncol(data2)]), c("red","green"))) 

Возможно ли это? Так что да, как?

ответ

3

Вы можете сделать это с расчетом сложения как

(не работает с тем же значением в другом столбце)

hepl_1=sapply(2:ncol(data2),function(i) ifelse(data2[[i]]>=mean(data2[[i]]),"rgb(255,0,0)","rgb(0,255,0)")) 
help_3=as.matrix(data2[2:ncol(data2)]) 

datatable(
    data2, rownames = FALSE, class = 'cell-border stripe', 
    options = list(
    dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')) 
) 
) %>% 
    formatStyle(colnames(data2)[2:ncol(data2)], backgroundColor = styleEqual(help_3, hepl_1)) 

Update

Вы можете создавать rowCallback как

datatable(
    data2, rownames = FALSE, class = 'cell-border stripe', 
    options = list(
    dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')), 
    rowCallback=JS(paste0("function(row, data) {\n", 
          paste(sapply(2:ncol(data2),function(i) paste0("var value=data[",i-1,"]; if (value!==null) $(this.api().cell(row,",i-1,").node()).css({'background-color':value <=", mean(data2[[i]])," ? 'red' : 'green'});\n") 
         ),collapse = "\n"),"}")) 
) 
) 
+0

Идея иметь коврик rix с числами и матрицей с соответствующими цветами, не работает, если у вас одинаковое значение в разных столбцах, когда оно находится в одном столбце красного цвета, а в другом зеленом. Затем он даст цвет первого столбца – Berecht

+0

Ах .. да, вы правы ... подумать об этом – Batanichek

+0

Вы можете дрожать или рандомизировать его после определения цветов. Только вам нужно быть уверенным, что созданное случайное число уникально. – Berecht