您如何使用purrr :: map将函数应用于嵌套列,并输出到新列?

时间:2019-04-15 17:37:28

标签: r purrr

我一般对Purrr和Tidyr都是陌生的。我正在尝试将函数映射到数据集的嵌套列,并在主(嵌套)小标题中将其作为新列输出。

原始尝试确实可以运行,但是似乎没有将正确的数据集应用于函数。当我从数据集列中的单个数据集上运行该函数时,它会给出正确的结果。当通过map使用所有变量运行该函数时(使用的语法请参见下文),结果会不同(错误)。我猜我语法不正确,并且正在将该函数应用于错误的数据集-但无法弄清楚正确的语法应该是什么。

dat是具有两个嵌套列的原始数据框data =原始数据集,datatidy =整洁数据集。我想在datatidy列上运行一个函数,并在dat中将结果输出为新的(嵌套列)。

  glimpse(dat)
        >  Observations: 535
        >     Variables: 4
        >     $ SITE_NO  <chr> "BC08EF0001", "BC08EF0001", "BC08EF0001", "BC08EF0001", "BC08EF0001", "BC08EF0001", "BC08EF0001", "B...
        >     $ variable <fct> CHLORIDE, FLUORIDE, SULPHATE, ALUMINUM TOTAL, ARSENIC TOTAL, BORON TOTAL, CADMIUM TOTAL, CHROMIUM TO...
        >     $ data     <list> [<tbl_df[234 x 15]>, <tbl_df[235 x 15]>, <tbl_df[234 x 15]>, <tbl_df[235 x 15]>, <tbl_df[235 x 15]>...
        >     $ datatidy <list> [<tbl_df[116 x 17]>, <tbl_df[116 x 17]>, <tbl_df[116 x 17]>, <tbl_df[116 x 17]>, <tbl_df[116 x 17]>... 
        > 

> glimpse(dat$dataTidy[[1]])
 $ DecDate        <dbl> 2005.047, 2005.121, 2005.195, 2005.312, 2005.392, 
 $ month          <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 
 $ season         <fct> Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, 
 $ Value          <dbl> 0.5, 0.7, 0.7, 0.3, 0.1, 0.1, 0.1, 0.2, 0.1, 0.4, 
 $ Date           <date> 2005-01-18, 2005-02-14, 2005-03-13, 2005-04-25, 
 $ Value_subDL    <dbl> 0.50, 0.70, 0.70, 0.30, 0.05, 0.05,
 $ logConcVal     <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 

    > results <- mutate(dat
    >         newcol = map(dataTidy, ~ EnvOut_fun(.x$Value_subDL, 
    >                                                        time = as.numeric(.x$Date), 
    >                                                        group = .x$season, 
    >                                                        time.name="as.numeric(Date)", 
    >                                                        group.name="season", 
    >                                                        y.name="Value_subDL", 
    >                                                        LOGY=.x$logConcVal)))

我尝试了以下thread中的语法,但似乎无法使其正常工作。

  

  dat %>% 
    mutate(newcolumn = map(dataTidy, ~ EnvOut_fun(.x[["Value_subDL"]],
                                                   time=as.numeric(.x[["Date"]], ...)))

EnvOut_fun示例。

该函数使用dataTidy中的列运行季节性kendall测试,并将原始(列表结果)另存为sk,并将一些信息提取到数据框中。主标题中每一行的包含sk和EnvOut数据帧的列表应保存到新的嵌套列中。

EnvOut_fun <- function(y, time, group, 
                       time.name=NULL, group.name=NULL, y.name="y", 
                       LOGY=FALSE){

  y = if(LOGY==FALSE) {y}else{log(y)}
  y.name = if(LOGY==FALSE) { y.name}else{paste0("Log(", y.name,")")}

  sk <- EnvStats::kendallSeasonalTrendTest(y ~ group+time,  
                                           year.name="time", season.name="season", 
                                           data.name="y.name")

  EnvOut <- tibble(
     tau=sk$estimate[["tau"]],
     slope=sk$estimate[["slope"]], 
     int = sk$estimate[["intercept"]],     
     p_val_raw = sk$p.value["z (Trend)"],
     slope_p_val = p_val_raw,
     numSeas = length(sk$sample.size)-1  ,
     medOfData = median(y),
     medOfTime = median(time) ,   
     time.nm = time.name, 
     block.nm = group.name, 
     data.nm = y.name, 
     LogY = LOGY
  ) %>% 
    mutate(int_from_data = medOfData- (slope* medOfTime))

    sk <- list(sk=sk, EnvOut=EnvOut)
 sk
}

编辑

以上两种语法均适用于将用户定义的函数应用于嵌套数据框。

0 个答案:

没有答案