Динамическая маркировка над таблицей в R - PullRequest
0 голосов
/ 14 мая 2018

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

Мой код:

proddata <- read.table("C:/...Production.csv",sep=";" , header=TRUE)  
forcdata <- read.table("C:...Forecast.csv", sep=";",header=TRUE)

wells<-unique(proddata[3]) mergedAll<-NULL

for (i in 1:length(wells[[1]])){

prod_w<-subset(proddata,Well ==wells[i,1])
forc_w<-subset(forcdata,Well ==wells[i,1])

t_prod<-t(prod_w[,c(1,2)]) t_forc<-t(forc_w[,c(1,2)])

delta<-t_prod[c(1,2),]
delta[2,]<-as.numeric(t_prod[2,])-as.numeric(t_forc[2,])

merged<- data.frame(t_prod[c(1,2),] ,t_forc[c(1,2),] ,delta)

colnames(merged) <- merged[1, ] merged <- merged[-1, ]

rownames(merged)<-wells[i,1]

if (!exists("mergedAll")){ mergedAll<-merged } else {
mergedAll<-rbind(mergedAll,merged) } }

library(gridExtra) grid.table(mergedAll)

Вот что я хочу: Динамические метки над таблицей

1 Ответ

0 голосов
/ 14 мая 2018

Для этого можно использовать tableHTML.

Пример данных

df <- structure(list(X2014 = c(10L, 101L, 111L), X2015 = c(20L, 202L, 
212L), X2016 = c(30L, 303L, 313L), X2017 = c(40L, 404L, 414L), 
    X2018 = c(50L, 505L, 515L), X2019 = c(50L, 506L, 516L), X2014.1 = c(12L, 
    112L, 122L), X2015.1 = c(18L, 118L, 128L), X2016.1 = c(41L, 
    141L, 132L), X2017.1 = c(60L, 160L, 151L), X2018.1 = c(55L, 
    155L, 170L), X2019.1 = c(-2L, -11L, -11L), X2014.2 = c(2L, 
    84L, 84L), X2015.2 = c(-11L, 162L, 181L), X2016.2 = c(-20L, 
    244L, 263L), X2017.2 = c(-5L, 350L, 345L), X2018.2 = c(52L, 
    517L, 527L), X2019.2 = c(10L, 28L, 38L)), .Names = c("X2014", 
"X2015", "X2016", "X2017", "X2018", "X2019", "X2014.1", "X2015.1", 
"X2016.1", "X2017.1", "X2018.1", "X2019.1", "X2014.2", "X2015.2", 
"X2016.2", "X2017.2", "X2018.2", "X2019.2"), class = "data.frame", row.names = c("W1", 
"W2", "W3"))

Базовое решение

настроить ваши динамические входы следующим образом:

years - это годы, которые у вас есть в вашем фрейме данных (Примечание: если у вас была структура данных, которая позволяла бы дублировать имена столбцов, вы также можете использовать unique(names(df)), чтобы получить тот же результат).num_years считает их, чтобы вы могли изменить входы.num_cols - это число столбцов объекта tableHTML.

years <- 2014:2019
num_years <- length(years)
num_cols <- 1 + num_years * 3

library(tableHTML)

Это создаст tableHTML, где год будет заголовком, а метки - вторыми заголовками над заголовками.

df %>% 
  tableHTML(headers = rep(years, 3),
            second_headers = list(c(1, rep(num_years, 3)),
                                  c("", "Production", "Forecast", "Difference")),
            widths = rep(100, num_cols))

Результат выглядит следующим образом:

basic_solution

Добавить CSS для форматирования таблицы:

Youможно использовать семейство функций add_css _ * для стилизации tableHTML:

df %>% 
  tableHTML(headers = rep(years, 3),
            second_headers = list(c(1, rep(num_years, 3)),
                                  c("", "Production", "Forecast", "Difference")),
            widths = rep(100, num_cols)) %>% 
  add_css_header(css = list("background-color",
                            "gray"),
                 headers = 1:num_cols) %>% 
  add_css_second_header(css = list("background-color",
                                   "gray"),
                        second_headers = 1:num_cols) %>% 
  add_css_row(css = list("background-color",
                         "darkgray"),
              rows = 4)  %>% 
  add_css_row(css = list("background-color",
                         "lightgray"),
              rows = c(3, 5))

Результат будет:

css_solution

...