как использовать функцию карты в г, чтобы найти диапазон и квантиль - PullRequest
0 голосов
/ 02 марта 2019

Я сначала смоделировал 500 выборок размера 55 в нормальном распределении.

samples <- replicate(500, rnorm(55,mean=50, sd=10), simplify = FALSE)

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

Это то, что у меня есть.Я не уверен насчет диапазона или квантиля.Я попробовал sapply и lapply, но не уверен, как они работают.

stats <- data.frame(
means = map_dbl(samples,mean),
medians = map_dbl(samples,median),
sd= map_dbl(samples,sd),

range= map_int(samples, max-min),
third_quantile=sapply(samples,quantile,type=3)
)

2) Затем нанесите на график распределение выборки (гистограмма) средних.Я пытаюсь построить график, но не понимаю, как получить среднее значение

stats <- gather(stats, key = "Trials", value = "Mean")

ggplot(stats,aes(x=Trials))+geom_histogram()

3) Затем я хочу построить остальные три статистики (три отдельных графика) в одном окне построения графиков.

Я знаю, что мне нужно использовать что-то вроде collect и facet_wrap, но я не уверен, как это сделать.

Ответы [ 2 ]

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

Функции map_dbl, которые вы используете, безусловно, хороши, но если вы все равно пытаетесь получить фрейм данных в конце, вам может быть проще преобразовать список в фрейм данных в начале, а затемпользуясь некоторыми dplyr функциями.

Сначала я сопоставляю список, создаю фрагменты и связываю его вместе с добавленным идентификатором.Преобразование создает столбец value значений выборки.summarise_at позволяет получить список функций - указание имен в списке устанавливает имена в результирующем фрейме данных.Вы можете использовать нотацию purrr ~., чтобы определить эти функции при необходимости.Сокращает количество раз, которое вам нужно map_dbl и т. Д.

library(tidyverse)
stats <- samples %>%
  map_dfr(as_tibble, .id = "sample") %>%
  group_by(sample) %>%
  summarise_at(vars(value), 
               .funs = list(mean = mean, median = median, sd = sd,
                            range = ~(max(.) - min(.)),
                            third_quartile = ~quantile(., probs = 0.75)))

head(stats)
#> # A tibble: 6 x 6
#>   sample  mean median    sd range third_quartile
#>   <chr>  <dbl>  <dbl> <dbl> <dbl>          <dbl>
#> 1 1       45.0   44.4  8.71  47.6           48.6
#> 2 10      51.0   52.0  9.55  49.3           56.2
#> 3 100     51.6   52.2 10.4   60.7           58.1
#> 4 101     51.6   51.1  9.92  37.6           57.2
#> 5 102     49.1   48.2  9.65  39.8           57.0
#> 6 103     52.2   51.3 10.1   47.4           58.5

Далее, в своем коде вы gather редактируете данные - что часто является решением, которое нужно людям для SO, - ноесли вы только пытаетесь показать средний столбец, вы можете работать с ним как есть.

ggplot(stats, aes(x = mean)) +
  geom_histogram()

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

Вы были почти там.Все, что нужно, это определить анонимные функции везде, где есть ошибки.

library(tidyverse)

set.seed(1234)    # Make the results reproducible

samples <- replicate(500, rnorm(55,mean=50, sd=10), simplify = FALSE)
str(samples)

stats <- data.frame(
  means = map_dbl(samples, mean),
  medians = map_dbl(samples, median),
  sd = map_dbl(samples, sd),
  range = map_dbl(samples, function(x) diff(range(x))),
  third_quantile = map_dbl(samples, function(x) quantile(x, probs = 3/4, type = 3))
)

str(stats)
#'data.frame':  500 obs. of  5 variables:
# $ means         : num  49.8 51.5 52.2 50.2 51.6 ...
# $ medians       : num  51.5 51.7 51 51.1 50.5 ...
# $ sd            : num  9.55 7.81 11.43 8.97 10.75 ...
# $ range         : num  38.5 37.2 54 36.7 60.2 ...
# $ third_quantile: num  57.7 56.2 58.8 55.6 57 ...
...