Извлечение элементов из вложенного списка и добавление в качестве нового столбца (вложенных) фреймов данных с использованием purrr - PullRequest
1 голос
/ 02 апреля 2019

Кажется, я не могу понять синтаксис мурлыканья для извлечения информации из вложенного списка результатов и размещения столбца результатов в виде нового столбца (вложенных столбцов) основного столбца.

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))
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...