Как создать таблицу сводной статистики со всеми соответствующими десятичными знаками, которые должны отображаться в результирующей таблице в R?

У меня исключительно большой набор данных (более 50 сайтов, более 100 растворов), и я хотел бы быстро создать сводную таблицу описательной статистики для данных и иметь возможность экспортировать ее в виде файла .csv.

Пример кода (очень небольшое подмножество моих данных):

Site <- c( "SC2", "SC2" , "SC2", "SC3" , "SC3" ,"SC3", "SC4", "SC4" ,"SC4","SC4","SC4")
Aluminum <- as.numeric(c(0.0565,  0.0668 ,0.0785,0.0292,0.0576,0.075,0.029,0.088,0.076,0.007,0.107))
Antimony <- as.numeric(c(0.0000578,  0.0000698, 0.0000215,0.000025,0.0000389,0.0000785,0.0000954,0.00005447,0.00007843,0.000025,0.0000124))

stats_data <- data.frame(Site, Aluminum, Antimony, stringsAsFactors=FALSE)

stats_data_gather =stats_data %>% gather(Solute, value, -Site)

table_test = stats_data_gather %>% 
  group_by(Site, Solute) %>%
  get_summary_stats(value, show = c("mean", "sd", "min", "q1", "median", "q3", "max"))

Это приводит к кадру данных, который вычисляет требуемую статистику, НО результаты усекаются только до трех знаков после запятой (т.е. то, что должно быть примерно 0,00000057, отображается как 0,000).

Я пробовал варианты использования:

options(digits = XX), 
format(DF, format = "e", digits = 2),
format.data.frame(table_test, digits = 8)

Я пробовал эти и другие образцы кода, найденные в Интернете, но ни один из них не будет воспроизводить сводную таблицу данных, которая включает все необходимые нули для результатов с небольшим числом (т.е. 0,00000057, а не 0,000). Меня бы даже устроило научное обозначение, но мне не удалось найти пример, который будет работать.

Это мой первый пост. Я надеюсь, что предоставил достаточно подробностей для помощи! Спасибо!


person Frost_Queen    schedule 11.03.2020    source источник


Ответы (2)


Это не работает, потому что в get_summary_stats жестко запрограммировано возвращать 3 цифры:

get_summary_stats
function (data, ..., type = c("full", "common", "robust", "five_number", 
    "mean_sd", "mean_se", "mean_ci", "median_iqr", "median_mad", 
    "quantile", "mean", "median", "min", "max"), show = NULL, 
    probs = seq(0, 1, 0.25)) 
{
  ..... 
        dplyr::mutate_if(is.numeric, round, digits = 3)
    if (!is.null(show)) {
        show <- unique(c("variable", "n", show))
        results <- results %>% select(!!!syms(show))
    }
    results
}

Вы можете либо взломать код выше, либо для того, что вы делаете, использовать функцию summarise_all, как показано ниже:

library(dplyr)
library(tidyr)

stats_data_gather %>%  group_by(Site, Solute) %>% summarise_all(list(~mean(.),~sd(.),
~list(c(summary(.))))) %>% unnest_wider(list)

# A tibble: 6 x 10
# Groups:   Site [3]
  Site  Solute    mean      sd    Min. `1st Qu.`  Median    Mean `3rd Qu.`
  <chr> <chr>    <dbl>   <dbl>   <dbl>     <dbl>   <dbl>   <dbl>     <dbl>
1 SC2   Alumi… 6.73e-2 1.10e-2 5.65e-2 0.0616    6.68e-2 6.73e-2 0.0726   
2 SC2   Antim… 4.97e-5 2.51e-5 2.15e-5 0.0000396 5.78e-5 4.97e-5 0.0000638
3 SC3   Alumi… 5.39e-2 2.31e-2 2.92e-2 0.0434    5.76e-2 5.39e-2 0.0663   
4 SC3   Antim… 4.75e-5 2.78e-5 2.50e-5 0.0000320 3.89e-5 4.75e-5 0.0000587
5 SC4   Alumi… 6.14e-2 4.19e-2 7.00e-3 0.029     7.60e-2 6.14e-2 0.088    
6 SC4   Antim… 5.31e-5 3.49e-5 1.24e-5 0.000025  5.45e-5 5.31e-5 0.0000784
# … with 1 more variable: Max. <dbl>

Имена столбцов могут быть немного неудачными, но вы можете легко переименовать их в q1 и q3.

person StupidWolf    schedule 12.03.2020

Вы можете использовать функцию summary для статистики, которую вы ищете:

sum.table <- summary(stats_data_gather)

Затем вы можете взять суммированные переменные из 3-го столбца, используя:

as.numeric(sub('.*:', '', sum.table[,3]))
person eonurk    schedule 11.03.2020