Кажется, я не могу понять синтаксис мурлыканья для извлечения информации из вложенного списка результатов и размещения столбца результатов в виде нового столбца (вложенных столбцов) основного столбца.
library(EnvStats)
library(tidyverse)
#create example dataset
df1 <- tibble(
Site=rep(c("Site1", "Site2"), 3, each=12),
Month=rep(c("Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"), 6),
Year=rep(c(2010, 2011, 2012), 2, each=12),
Value=sample(seq(from=0, to=20, by=.1), size=72, replace=TRUE)
)
df1 <- df1 %>% nest(-Site)
res <- mutate(
df1,
sk = map(data, ~ {
EnvStats::kendallSeasonalTrendTest(.x$Value, season = .x$Month,
year = .x$Year)
}))
Структура основного тибла и вложенный список результатов (усеченный):
glimpse(res)
Observations: 2 Variables: 3
$ Site <chr> "Site1", "Site2"
$ data <list> [<tbl_df[36 x 3]>, <tbl_df[36 x 3]>]
$ sk <list> [<4.9772727, 0.3049971, 11, 0.9322623, 0.7603683,
glimpse(res$sk)
List of 2
$ :List of 15
..$ estimate : Named num [1:3] -0.222 -1.2 1766.625
.. ..- attr(*, "names")= chr [1:3] "tau" "slope" "intercept"
...more here
$ :List of 15
..$ estimate : Named num [1:3] -0.222 -1.2 1766.625
.. ..- attr(*, "names")= chr [1:3] "tau" "slope" "intercept"
Я могу извлечь результаты из списков sk и разместить их в качестве нового столбца в главномТиббл.Например:
#function to extract slope from a sk list
slope1 <- function(x) x$estimate[["slope"]]
#how to get results from nested list as a column in the main dataframe
ex1 <- res %>% mutate(
tau = map_dbl(sk, ~.x$estimate[["tau"]]),
slope = map_dbl(sk, slope1)
)
glimpse(ex1)
Observations: 2
Variables: 5
$ Site <chr> "Site1", "Site2"
$ data <list> [<tbl_df[36 x 3]>, <tbl_df[36 x 3]>]
$ sk <list> [<4.9772727, 0.3049971, 11, 0.9322623, 0.7603683, 0.08333333, 0.47500000, -445.02500000, 0, 0,...
$ tau <dbl> 0.08333333, -0.22222222
$ annual_slope <dbl> 0.475, -1.200
Но я не могу понять синтаксис для извлечения результатов из списков sk в новый фрейм данных и прикрепить этот фрейм данных в качестве нового столбца (1 df для каждого сайта) в главном резdataframe.
Поиск в res df нового столбца EnvOut, как показано ниже:
$ Site <chr> "Site1", "Site2"
$ data <list> [<tbl_df[36 x 3]>, <tbl_df[36 x 3]>]
$ sk <list> [<4.9772727, 0.3049971, 11, 0.9322623, 0.7603683,
$ EnvOut <list> [<tbl_df[A x B]>, …
Следующее не работает ... Вероятно, это проблема синтаксиса purrr, но яне могу понять это.
#Now - how to create new column in res of (nested) dataframes with results extracted from original nested sk lists
#The dt_fun function will give me the dataframe for a single list
#--> how to add this as nested list of dataframe to the original res dataframe??
df_fun <- function(df){
df <- tibble(
tau=df$estimate[["tau"]],
slope=slope1(df)
)
df
}
test <- df_fun(res$sk[[1]])
ex2 <- res %>% mutate(
envOut = map(sk, ~ dt_fun(.x[[1]]))
)
Редактировать: Кажется, что работают ex2 и ex3 нижеприведенные ниже.Также для добавления результатов в информационный фрейм без создания внешней функции работает ex4 ниже.Не уверен, что это самый эффективный синтаксис - но он работает.
ex2 <- res %>% mutate(
envOut = map(sk, ~ df_fun(.x))
)
ex3 <- mutate(res,
envOut = map(sk, df_fun)
)
ex4 <- res %>% mutate(
envOut = map(sk, ~ tibble(tau = .x$estimate[["tau"]],
slope = slope1(.x))
))