DT::datatable для сгруппированного фрейма данных в отчете Rmarkdown (HTML)

#javascript #r #button #group-by #dt

#javascript #r #кнопка #группировка по #dt

Вопрос:

У меня есть сгруппированный вывод фрейма данных, который я хочу визуализировать как DT ::datatable с кнопками загрузки (csv, excel) в отчете Rmarkdown (HTML).

Он отлично работает, когда я создаю Rmarkdown, но показывает ошибку, в которой говорится, что нет метода group by, применимого для классов объектов datatable и htmlwidgets.

Заранее большое спасибо.

Вот мой код :

 ## Grouping columns

Site <- LETTERS[1:6]
Block <- LETTERS[1:4] ## For each Site
Plot <- paste(rep("P",10),seq(1,10,1),sep="_") ## For each Block 
df <- expand.grid(Site = Site, Block = Block, Plot = Plot)

## Dependant variables

df <-cbind.data.frame(df,data.frame(Tmin=runif(min=-3,max=18,n=240),
                         Tmax=runif(min=10,max=39, n=240),
                                    Index1=runif(0,5,n=240),
                                    Index2=runif(1,10,n=240)))

# Export grouped df as datatable
library(dplyr)


df%>%
  group_by(Site,Block,Plot)%>%
  summarize(Tmin_avg=mean(Tmin), Tmax_avg=mean(Tmax))%>%
  DT::datatable(
   extensions = 'Buttons', options = list(
    dom = 'Bfrtip',
    buttons = 
      list('copy', 'print', list(
        extend = 'collection',
        buttons = c('csv', 'excel', 'pdf'),
        text = 'Download'
      ))
   ))
 

Комментарии:

1. dplyr::group_by используется для обобщения и агрегирования данных. Вы ничего не агрегировали в своем примере. Возможно, вы хотели это сделать?

2. Действительно! Я отредактировал код, я просто не хочу упоминать об этом.

3. Пожалуйста, добавьте также эту зависимость (library (tidyverse) или library (dplyr)), чтобы другие могли запустить ваш пример. И удалить … из summary()

Ответ №1:

Вы забыли объединить свои данные, и вам следует удалить ... из функции суммирования. Используются ... внутри функций, чтобы предоставить пользователю гибкость при добавлении существующих параметров к функциям. Например.

 library(tidyverse) 

aggfun <- function(df, ...) {
  df%>%
    group_by(Site,Block,Plot)%>%
    summarize(Tmin_avg=mean(Tmin), Tmax_avg=mean(Tmax), ...)%>%
    DT::datatable(
      extensions = 'Buttons', options = list(
        dom = 'Bfrtip',
        buttons = 
          list('copy', 'print', list(
            extend = 'collection',
            buttons = c('csv', 'excel', 'pdf'),
            text = 'Download'
          ))
      ))
}

aggfun(df, T_min = min(Tmin))
 

Ваш пример работает, если вы внесете изменения:

 df%>%
  group_by(Site,Block,Plot)%>%
  summarize(Tmin_avg=mean(Tmin), Tmax_avg=mean(Tmax))%>%
  DT::datatable(
   extensions = 'Buttons', options = list(
    dom = 'Bfrtip',
    buttons = 
      list('copy', 'print', list(
        extend = 'collection',
        buttons = c('csv', 'excel', 'pdf'),
        text = 'Download'
      ))
   ))
 

Комментарии:

1. Это работает, большое спасибо. Я хотел бы упомянуть, что «…» были добавлены, чтобы неявно указать, что множественные агрегации происходят в функции суммирования для нескольких переменных.