我一般对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
}
编辑
以上两种语法均适用于将用户定义的函数应用于嵌套数据框。