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