Ваш объект nst
является фреймом данных;под капотом фрейма данных находится список столбцов.Поэтому, если вы примените map
к nst
, он будет отображаться по столбцам, а не по группам в ваших данных.Также обратите внимание, что вторым аргументом map
должна быть функция (или несколько других выражений, которые являются сокращением для функций - см. Документацию для purrr::map
).
Существует много способовВы можете решить свою проблему.Мой любимый вариант - использовать group_by
и do
с dplyr вместе с tidy
с метлой :
library(dplyr)
library(tidyr)
library(purrr)
library(tseries)
library(broom)
ChickWeight %>%
group_by(Diet) %>%
do(tidy(jarque.bera.test(.$weight)))
# # A tibble: 4 x 5
# # Groups: Diet [4]
# Diet statistic p.value parameter method
# <fct> <dbl> <dbl> <dbl> <fct>
# 1 1 46.7 7.28e-11 2 Jarque Bera Test
# 2 2 18.8 8.36e- 5 2 Jarque Bera Test
# 3 3 12.4 2.00e- 3 2 Jarque Bera Test
# 4 4 5.17 7.54e- 2 2 Jarque Bera Test
Обратите внимание, что tidy
занимаетвывод jarque.bera.test
и превращает его в однорядный фрейм данных, и это повторяется для каждой группы функцией do
.Вот чистый подход dplyr :
ChickWeight %>%
group_by(Diet) %>%
summarize(p.value = jarque.bera.test(weight)$p.value)
# # A tibble: 4 x 2
# Diet p.value
# <fct> <dbl>
# 1 1 7.28e-11
# 2 2 8.36e- 5
# 3 3 2.00e- 3
# 4 4 7.54e- 2
Следующий подход, использующий nest
и map
.Обратите внимание, что второй столбец фрейма данных, созданный nest
, является списком-столбцом.Мы используем pull
, чтобы вытащить только столбец списка, а затем используем map
, чтобы выполнить тест Jarque-Bera для каждой группы.
ChickWeight %>%
nest(-Diet) %>%
pull(data) %>%
map(~ jarque.bera.test(.$weight))
# [[1]]
#
# Jarque Bera Test
#
# data: .$weight
# X-squared = 46.687, df = 2, p-value = 7.278e-11
#
#
# [[2]]
#
# Jarque Bera Test
#
# data: .$weight
# X-squared = 18.779, df = 2, p-value = 8.36e-05
#
#
# [[3]]
#
# Jarque Bera Test
#
# data: .$weight
# X-squared = 12.426, df = 2, p-value = 0.002003
#
#
# [[4]]
#
# Jarque Bera Test
#
# data: .$weight
# X-squared = 5.1686, df = 2, p-value = 0.07545
Обратите внимание, что карта принимает формулу как компактный способ написания анонимная функция .Наконец, вот несколько несколько более грубых подходов, которые сочетают map
и dplyr :
map(1:4, ~ filter(ChickWeight, Diet == .) %>% pull(weight) %>% jarque.bera.test)
map(1:4, ~ filter(ChickWeight, Diet == .)) %>%
map(~ pull(., weight)) %>%
map(~ jarque.bera.test(.))