Сводная таблица с несколькими факторами в Rmarkdown для публикации - PullRequest
0 голосов
/ 05 августа 2020

Это мой второй пост по этому вопросу. Первый был закрыт без решения моей проблемы с форматированием таблицы.

Я новичок в Stack Overflow и довольно новичок в Rmarkdown. Я пытаюсь написать публикацию с помощью Rmarkdown (output = book down :: pdf_book), и у меня проблемы с форматированием таблицы. Я хочу создать плоскую таблицу в блоке ar, чтобы получить такую ​​таблицу, но со средним значением вместо count:

Формат Goud, но с count:

                     F2       N0    N1    N2   
                     F1       I II  I II  I II
Variable F3                             
V1     T                      3  3  3  3  3  3
         V                      3  3  3  3  3  3
V2      T                      3  3  3  3  3  3
         V                      3  3  3  3  3  3
V3    T                      3  3  3  3  3  3
         V                      3  3  3  3  3  3
V4      T                      3  3  3  3  3  3
         V                      3  3  3  3  3  3
V5      T                      3  3  3  3  3  3
         V                      3  3  3  3  3  3

Предположим, у меня есть фрейм данных, который выглядит следующим образом:

F1  F2  F3  V1  V2  V3  V4  V5
I   N0  T   1.977546019 137.5   0.83    8.114217417 1.032679447
I   N0  T   2.342365156 139.4   0.85    10.3602728  0.871637237
I   N0  T   2.170706854 141.2   0.82    11.59271819 1.258035755
I   N0  V   1.559072025 114.9   0.87    11.57618562 1.661523112
I   N0  V   1.984240008 118.6   0.88    11.9835584  1.60688624
I   N0  V   1.68756027  116.3   0.88    11.79686026 1.78102523
I   N1  T   2.19858517  139.7   0.85    33.1128997  4.312955185
I   N1  T   3.249054469 136.4   0.86    29.69128121 3.047780521
I   N1  T   2.223041022 142.1   0.85    20.65967924 2.332772924
I   N1  V   1.595849998 118.2   0.89    19.84579734 2.191828463
I   N1  V   1.72860847  114.8   0.86    20.16367213 5.017873836
I   N1  V   2.133891213 115.7   0.84    23.07712358 3.930948522
I   N2  T   3.152019262 131.3   0.89    35.5848969  5.589698563
I   N2  T   3.367223676 138.7   0.87    34.05297654 2.730557232
I   N2  T   3.059409463 137.4   0.83    35.37992694 3.548049932
I   N2  V   1.71633507  112.3   0.93    34.09476427 5.25868398
I   N2  V   2.284833663 116.9   0.84    22.19728478 3.518505779
I   N2  V   1.866355607 113.6   0.86    29.02993798 5.014262016
II  N0  T   1.768065012 127.8   0.83    7.6010075   9.42999993
II  N0  T   3.250876694 129.4   0.83    29.23677503 27.91017246
II  N0  T   2.815832568 133.6   0.83    4.051675097 10.12918774
II  N0  V   3.891509434 109.1   0.88    5.469474969 9.770670085
II  N0  V   2.882145915 111.2   0.87    17.00061485 21.40077399
II  N0  V   4.128069071 113.7   0.88    12.9571096  37.50296115
II  N1  T   3.003514751 126 0.84    39.39306152 7.043527056
II  N1  T   3.134655188 129.2   0.85    11.4866755  21.51749579
II  N1  T   2.785986782 131.5   0.83    19.78519656 2.176659469
II  N1  V   3.089649674 107.5   0.88    17.32529262 12.99396947
II  N1  V   4.466019417 112.6   0.89    12.03083642 20.22446923
II  N1  V   3.1820755   116.1   0.84    12.63619614 12.65798269
II  N2  T   3.428280773 134.2   0.87    16.67590015 14.49664664
II  N2  T   4.430091185 139.8   0.85    36.47033184 12.18635248
II  N2  T   3.362380446 132.4   0.86    67.7182946  11.7089442
II  N2  V   3.672823219 111.6   0.9 24.5684152  13.5849653
II  N2  V   3.031651201 110.1   0.88    19.7549665  15.6015459
II  N2  V   3.198950088 108.7   0.88    20.86135738 14.60295017

Где F столбцов - это факторы, а V столбцы - переменные

Назовем этот фрейм данных «df».

Я пробовал два способа реализовать плоскую таблицу:

Сначала

Я помещаю имена переменных в столбец, используя функцию pivot_longer из tidy verse пакета:

df %>% pivot_longer(
-c(F1,F2,F3),
names_to = "Variable",
values_to = "Value") -> df2

и использовал этот код для построения плоской таблицы:

ftable(df2, row.vars = c("Variable", "F3"), col.vars = c("F2", "F1"))

Здесь я получаю форматирование целевой таблицы, но значения являются счетчиками, а не средствами (см. "GoodTable" ").

Второй

Я вычисляю средства (и стандартную ошибку), используя пакет '' 'dplyr' ''

df2_summary <- dplyr::summarise(df2_grouped,
                                     count = dplyr::n(),
                                     mean = round(mean(Value), 2),
                                     SE = round(sd(Value)/sqrt(count),2))

, но я не знаю, как преобразовать df2_summary в таблицу, которая выглядит как показано выше

Я знаю, что могу использовать латексный язык для форматирования и заполнения таблицы, но пора c onsuming, а также может вызвать опечатку. Кто-нибудь знает, как это сделать?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 августа 2020

Я работал над этим вопросом. Вот код, дающий не точный, но похожий на тот формат таблицы, который я хотел: я использовал функцию collapse_rows, поэтому мне пришлось транспонировать таблицу по сравнению с той, которую я хотел. Я не знаю такой функции для столбца.

df2 <- df %>% 
  group_by(Month, Enrichment, Vegetation) %>% 
  summarise(
    across(
      .cols =  starts_with(c("V")),
      .fns  = list(mean, sd),
      .names = "{col}_{fn}"
    )
  )

вот уродливый код для вычисления стандартной ошибки вместо стандартного отклонения:

df2[,c(5,7,9,11,13,15,17)] <- df2[,c(5,7,9,11,13,15,17)]/sqrt(3)

Затем измените имя столбца но имейте в виду порядок (вы можете посмотреть функцию "start_with", если вы забыли). Два первых столбца - это факторы, которые я удалил, так как они часто длинны, и мне нужно уменьшить размер таблицы. Вероятно, это не самый эффективный способ сделать это, но, по крайней мере, он работает

colnames(df2)[2:17] <- c("", "", "Mean", "SE","Mean", "SE","Mean", "SE","Mean", "SE","Mean", "SE")

Я использовал пакет kableExtra для следующих

library(kableExtra)
kable(df2, "latex", digits = 1,
      booktabs = TRUE, align = "c",
      caption = '(ref:df)',
      linesep = "") %>%
add_header_above(c(" " = 3, "V1" = 2, "V2" = 2, "V3" = 2, "V4" = 2, "V5" = 2),
                   bold = T) %>%
  collapse_rows(1:2,
                row_group_label_position = 'stack',
                latex_hline = "none")%>%
 landscape() 

На всякий случай, это очень красивые виньетки для пакета kableExtra

0 голосов
/ 11 августа 2020

Это похоже на то, что вы хотите? Используйте dput для отправки фрейма данных вместо вывода текста, в котором были лишние пробелы, которые необходимо было удалить.

library(tidyverse)

df <- read_delim(file = "
F1 F2 F3 V1 V2 V3 V4 V5
I N0 T 1.977546019 137.5 0.83 8.114217417 1.032679447
I N0 T 2.342365156 139.4 0.85 10.3602728 0.871637237
I N0 T 2.170706854 141.2 0.82 11.59271819 1.258035755
I N0 V 1.559072025 114.9 0.87 11.57618562 1.661523112
I N0 V 1.984240008 118.6 0.88 11.9835584 1.60688624
I N0 V 1.68756027 116.3 0.88 11.79686026 1.78102523
I N1 T 2.19858517 139.7 0.85 33.1128997 4.312955185
I N1 T 3.249054469 136.4 0.86 29.69128121 3.047780521
I N1 T 2.223041022 142.1 0.85 20.65967924 2.332772924
I N1 V 1.595849998 118.2 0.89 19.84579734 2.191828463
I N1 V 1.72860847 114.8 0.86 20.16367213 5.017873836
I N1 V 2.133891213 115.7 0.84 23.07712358 3.930948522
I N2 T 3.152019262 131.3 0.89 35.5848969 5.589698563
I N2 T 3.367223676 138.7 0.87 34.05297654 2.730557232
I N2 T 3.059409463 137.4 0.83 35.37992694 3.548049932
I N2 V 1.71633507 112.3 0.93 34.09476427 5.25868398
I N2 V 2.284833663 116.9 0.84 22.19728478 3.518505779
I N2 V 1.866355607 113.6 0.86 29.02993798 5.014262016
II N0 T 1.768065012 127.8 0.83 7.6010075 9.42999993
II N0 T 3.250876694 129.4 0.83 29.23677503 27.91017246
II N0 T 2.815832568 133.6 0.83 4.051675097 10.12918774
II N0 V 3.891509434 109.1 0.88 5.469474969 9.770670085
II N0 V 2.882145915 111.2 0.87 17.00061485 21.40077399
II N0 V 4.128069071 113.7 0.88 12.9571096 37.50296115
II N1 T 3.003514751 126 0.84 39.39306152 7.043527056
II N1 T 3.134655188 129.2 0.85 11.4866755 21.51749579
II N1 T 2.785986782 131.5 0.83 19.78519656 2.176659469
II N1 V 3.089649674 107.5 0.88 17.32529262 12.99396947
II N1 V 4.466019417 112.6 0.89 12.03083642 20.22446923
II N1 V 3.1820755 116.1 0.84 12.63619614 12.65798269
II N2 T 3.428280773 134.2 0.87 16.67590015 14.49664664
II N2 T 4.430091185 139.8 0.85 36.47033184 12.18635248
II N2 T 3.362380446 132.4 0.86 67.7182946 11.7089442
II N2 V 3.672823219 111.6 0.9 24.5684152 13.5849653
II N2 V 3.031651201 110.1 0.88 19.7549665 15.6015459
II N2 V 3.198950088 108.7 0.88 20.86135738 14.60295017",
         delim = ' ') %>%
  mutate(across(starts_with("V"), as.numeric))

df2 <- df %>% 
  pivot_longer(cols = starts_with("V"),
           names_to = "Variable", 
           values_to = 'Value') %>%
  group_by(Variable, F3, F1, F2) %>%
  summarise(avg = mean(Value),
        count = n()) %>%
  ungroup() %>%
  pivot_wider(id_cols = c(Variable, F3),
          names_from = c(F1, F2),
          names_glue = "{F1}_{F2}",
          values_from = avg)

print(df2)

# A tibble: 10 x 8
   Variable F3       I_N0    I_N1    I_N2   II_N0  II_N1   II_N2
   <chr>    <chr>   <dbl>   <dbl>   <dbl>   <dbl>  <dbl>   <dbl>
 1 V1       T       2.16    2.56    3.19    2.61    2.97   3.74 
 2 V1       V       1.74    1.82    1.96    3.63    3.58   3.30 
 3 V2       T     139.    139.    136.    130.    129.   135.   
 4 V2       V     117.    116.    114.    111.    112.   110.   
 5 V3       T       0.833   0.853   0.863   0.83    0.84   0.86 
 6 V3       V       0.877   0.863   0.877   0.877   0.87   0.887
 7 V4       T      10.0    27.8    35.0    13.6    23.6   40.3  
 8 V4       V      11.8    21.0    28.4    11.8    14.0   21.7  
 9 V5       T       1.05    3.23    3.96   15.8    10.2   12.8  
10 V5       V       1.68    3.71    4.60   22.9    15.3   14.6  
...