Как применить функцию к вложенному столбцу, используя purrr :: map, и вывести в новый столбец? - PullRequest
0 голосов
/ 15 апреля 2019

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

Исходная попытка действительно выполняется, но, похоже, не применяет правильный набор данных к функциям. Когда я запускаю функцию для отдельного набора данных из столбца наборов данных, она дает правильные результаты. Функция при запуске со всеми переменными через карту (см. Ниже используемый синтаксис) дает разные (неверные) результаты. Я предполагаю, что у меня неправильный синтаксис, и он применяет функцию к неправильному набору данных - но не могу понять, каким должен быть правильный синтаксис.

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)))

Я попробовал синтаксис в следующем потоке , но не могу заставить его работать.

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

Пример EnvOut_fun.

Функция использует столбцы из dataTidy для запуска сезонного теста Кендалла, сохраняет оригинал (список результатов) в виде 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
}

EDIT

Оба приведенных выше синтаксиса работают для применения пользовательской функции к вложенному фрейму данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...