У меня есть ответ, используя data.table
и DT
, это немного сложно.Вот оно:
library(data.table)
library(DT)
store <- setDT(store)
store[,plouf := paste0(tempr,"(",value,")")]
store[,color := ifelse(value > 0,1,0)]
table1 <- dcast(store[,.SD[1],.SDcols = c("product","shop"),by = plouf],product ~ shop,value.var = "plouf")
table2 <- dcast(store[,.SD[1],.SDcols = c("product","shop","color"),by = plouf],product ~ shop,value.var = "color")
table2[,names(table2)[-1] := lapply(.SD,function(x){ifelse(is.na(x),0,x)}),.SDcols = names(table2)[-1] ]
setnames(table2,paste0(names(table1),"_col"))
plouf <- cbind(table1,table2[,-1])
datatable(plouf) %>%
formatStyle(names(table1)[-1],paste0(names(table1)[-1],"_col"), backgroundColor = styleEqual(c(0, 1), c('red', 'green')))
Объяснение: во-первых, я переделываю вашу таблицу store2
, используя dacst
(переход к большому формату), что более удобно, и которое я буду использовать повторно для определения цветов:
store <- setDT(store)
store[,plouf := paste0(tempr,"(",value,")")]
table1 <- dcast(store[,.SD[1],.SDcols = c("product","shop"),by = plouf],product ~ shop,value.var = "plouf")
product fghj sad sadas xzzv
1: ab NA 35(0) NA NA
2: ac 14(4) 14(-6) 24(8) 5(0)
Здесь store[,.SD[1],.SDcols = c("product","shop"),by = plouf]
позволяют иметь только одну строку на данные, которые вы хотите, чтобы избежать реплики
Затем я делаю то же самое, но с переменной, которая дает цвет (1для зеленого, 0 для красного):
store[,color := ifelse(value > 0,1,0)]
table2 <- dcast(store[,.SD[1],.SDcols = c("product","shop","color"),by = plouf],product ~ shop,value.var = "color")
product fghj sad sadas xzzv
1: ab NA 0 NA NA
2: ac 1 0 1 0
Я преобразую Nas в 0 во всех столбцах, кроме первого:
table2[,names(table2)[-1] := lapply(.SD,function(x){ifelse(is.na(x),0,x)}),.SDcols = names(table2)[-1] ]
product fghj sad sadas xzzv
1: ab 0 0 0 0
2: ac 1 0 1 0
и изменяю имена второй таблицы (даваяцвета):
setnames(table2,paste0(names(table1),"_col"))
затем вы связываете два
plouf <- cbind(table1,table2[,-1])
и используете DT
, где вы указываете другой столбец: один для цели, один для цвета фона
datatable(plouf) %>%
formatStyle(names(table1)[-1],paste0(names(table1)[-1],"_col"), backgroundColor = styleEqual(c(0, 1), c('red', 'green')))
![enter image description here](https://i.stack.imgur.com/ppGRY.png)
Мне пришлось изменить ваши данные, потому что не было уникального набора для каждого магазина.Вот данные:
product<-c("ab","ab","ac","ac","ac","ac")
shop<-c("sad","sad","sad","sadas","fghj","xzzv")
category<-c("a","a","a","b","b","b")
tempr<-c(35,35,14,24,14,5)
value<-c(0,0,-6,8,4,0)
store<-data.frame(product,shop,category,tempr,value)