Код сводной таблицы с обобщенными средними значениями на основе уровней фактора (с общим столбцом) - PullRequest
0 голосов
/ 24 марта 2019

Я хотел бы, чтобы код создавал сводную таблицу, в которой несколько средних рассчитывались на основе двух критериев (то есть уровней факторных переменных). Эти уровни находятся в соответствующих столбцах, но я хотел бы разрезать их на свои собственные столбцы таблицы, а также создать общий столбец (т. Е. Среднее значение обоих уровней, вместе взятых). У меня есть следующий пример кода:

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

Depth<-c('0',   '0.1-2.0',  '2.1-10.0', '10.1-20.0',    '20.1- 
50.0',  '50.1-100.0',   '0', '0.1-2.0', '2.1-10.0', '10.1-20.0',     
'20.1-50.0',    '50.1-100.0')
Tag<-   c('Tag.1',  'Tag.1',    'Tag.1',    'Tag.1',     
'Tag.1',    'Tag.1',    'Tag.2',    'Tag.2',    'Tag.2',     
'Tag.2',    'Tag.2',    'Tag.2')
Proportion<-    c(2.287356322,  5.896551724,    9.528735632,     
7.229885057,    73.54022989,    1.517241379,    0.5,    86.3,   13.2,    
0.1,    0.1,    0.1)
Season<-    c('Autumn', 'Autumn',   'Autumn',   'Autumn',    
'Autumn',   'Autumn',   'Summer',   'Summer',   'Summer',    
'Summer',   'Summer',   'Summer')

df<-data.frame(Depth, Tag, Proportion, Season)

, из которого я могу создать следующую таблицу:

library(knitr)
df$Proportion<-as.numeric(df$Proportion)
df$Depth<-as.factor(df$Depth)

tt1<-df%>%
  group_by(Season, Depth)%>%
  summarise(Mean=mean(Proportion))

kable(tt1)


|Season |Depth      |      Mean|
|:------|:----------|---------:|
|Autumn |0          |  2.287356|
|Autumn |0.1-2.0    |  5.896552|
|Autumn |10.1-20.0  |  7.229885|
|Autumn |2.1-10.0   |  9.528736|
|Autumn |20.1-50.0  | 73.540230|
|Autumn |50.1-100.0 |  1.517241|
|Summer |0          |  0.500000|
|Summer |0.1-2.0    | 86.300000|
|Summer |10.1-20.0  |  0.100000|
|Summer |2.1-10.0   | 13.200000|
|Summer |20.1-50.0  |  0.100000|
|Summer |50.1-100.0 |  0.100000|

Но дальнейшая сводка будет полезна читателю (т. Е. В таблице будет только четыре столбца: 1 Глубина, 2 Среднее значение, 3 Среднее значение и 4 Всего)

Я пытался:

ttt1<-df%>%
  group_by(Depth)%>%
  mutate(meanAut=case_when(Season=='Autumn' ~ 
 summarise(mean(Proportion))))%>%
    mutate(meanSum=case_when(Season=='Summer' ~ 
summarise(mean(Proportion))))%>%
 bind_rows(summarise_all(., funs(if(is.numeric(.)) sum(.) else "Total")))

Но получите ошибку: Ошибка в mutate_impl (.data, точки): Ошибка оценки: нет применимого метода для 'summarise_', примененного к объекту класса "c ('double', 'numeric')".

Ожидаемый результат:

Depth       meanAut meanSum Total
0           2.2     NA      2.2
0.1-2.0     5.8     86.3    46.05
10.1-20.0   7.2     0.1     3.65
2.1-10.0    9.5     13.2    11.35
20.1-50.0   73.5    0.1     36.8
50.1-100.0  1.5     0.1     0.8

Буду признателен за любые советы по форматированию таблицы!

1 Ответ

0 голосов
/ 24 марта 2019

Одна tidyverse возможность может быть:

df %>%
 group_by(Depth, Season) %>%
 summarise(mean_season = mean(Proportion, na.rm = TRUE)) %>%
 mutate(Season = paste("Mean", Season, sep = "_")) %>%
 spread(Season, mean_season)  %>%
 left_join(df %>%
 group_by(Depth) %>%
 summarise(Mean_Total = mean(Proportion, na.rm = TRUE)),
 by = c("Depth" = "Depth"))

  Depth      Mean_Autumn Mean_Summer Mean_Total
  <fct>            <dbl>       <dbl>      <dbl>
1 0                 2.29         0.5      1.39 
2 0.1-2.0           5.90        86.3     46.1  
3 10.1-20.0         7.23         0.1      3.66 
4 2.1-10.0          9.53        13.2     11.4  
5 20.1-50.0        73.5          0.1     36.8  
6 50.1-100.0        1.52         0.1      0.809

Здесь он, во-первых, рассчитывает средние значения по глубинам и временам года. Во-вторых, он создает новые имена переменных, содержащие «Среднее». В-третьих, он превращает имена новых переменных в столбцы, а значения - в значения. В-четвертых, он рассчитывает общее среднее значение по глубине. Наконец, он объединяет общие и сезонные средние, объединяя их в «Глубину».

И с добавлением kable() из knitr:

df %>%
 group_by(Depth, Season) %>%
 summarise(mean_season = mean(Proportion, na.rm = TRUE)) %>%
 mutate(Season = paste("Mean", Season, sep = "_")) %>%
 spread(Season, mean_season)  %>%
 left_join(df %>%
 group_by(Depth) %>%
 summarise(Mean_Total = mean(Proportion, na.rm = TRUE)),
 by = c("Depth" = "Depth")) %>%
 kable()

|Depth      | Mean_Autumn| Mean_Summer| Mean_Total|
|:----------|-----------:|-----------:|----------:|
|0          |    2.287356|         0.5|  1.3936782|
|0.1-2.0    |    5.896552|        86.3| 46.0982759|
|10.1-20.0  |    7.229885|         0.1|  3.6649425|
|2.1-10.0   |    9.528736|        13.2| 11.3643678|
|20.1-50.0  |   73.540230|         0.1| 36.8201149|
|50.1-100.0 |    1.517241|         0.1|  0.8086207|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...