#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. Это работает, большое спасибо. Я хотел бы упомянуть, что «…» были добавлены, чтобы неявно указать, что множественные агрегации происходят в функции суммирования для нескольких переменных.