r - Combine lapply, seq_along and ddply



我一直在这个论坛上搜索,并试图在我的情况下实现这些问题之前回答中所说的内容。但是,我的代码中缺少某些内容。

我使用 lapply() 和里面运行 ddply 的函数。这很好用。但是,我想通过读取数据框的名称来识别单个数据框的每个结果,而不是 [[1]]、[[2]]......

出于这个原因,我正在尝试实现seq_along论点,但没有成功。让我们看看我有什么:

  1. 我创建了一个列表,将 16 个不同的数据帧(具有相同的结构)分组到一个对象中,称为 melt_noNA_noDC_regression:

    melt_noNA_noDC_regression <- 
    list(I1U_melt_noNA_noDC_regression, I1L_melt_noNA_noDC_regression,
    I1U_melt_noNA_noDC_regression, I1L_melt_noNA_noDC_regression,
    CU_melt_noNA_noDC_regression, CL_melt_noNA_noDC_regression,
    P3U_melt_noNA_noDC_regression, P3L_melt_noNA_noDC_regression,
    P4U_melt_noNA_noDC_regression, P4L_melt_noNA_noDC_regression,
    M1U_melt_noNA_noDC_regression, M1L_melt_noNA_noDC_regression, 
    M2U_melt_noNA_noDC_regression, M2L_melt_noNA_noDC_regression,
    M3U_melt_noNA_noDC_regression, M3L_melt_noNA_noDC_regression)
    
  2. 后来,我成功地运行了这个 lapply() 行。

    lapply(melt_noNA_noDC_regression, function(x) ddply(x, .(Species), model_regression))
    
  3. 由于我有 16 个不同的数据框,我想在 lapply 函数的结果中识别它们。我已经尝试了几种组合来在 lapply 代码中包含seq_along,如下所示:

    lapply(melt_noNA_noDC_regression, function(x) {
    ddply(x, .(Species), model_regression)      
    seq_along(x), function(i) paste(names(x)[[i]], x[[i]])
    })
    

但是,我一直不断收到错误,这有点令人沮丧。这也许很容易解决,但我是阻止的。

有什么想法可以解决这个问题吗?

考虑使用eapply(lapply鲜为人知的兄弟)或mget来检索数据帧的命名列表。然后通过lapply运行它们,以便ddply调用返回具有新相应值的相同命名数据帧列表。

df_list <- eapply(.GlobalEnv, function(d) d)[c("I1U_melt_noNA_noDC_regression",
"I1L_melt_noNA_noDC_regression",
"I1U_melt_noNA_noDC_regression",
...)]
df_list <- mget(c("I1U_melt_noNA_noDC_regression",
"I1L_melt_noNA_noDC_regression",
"I1U_melt_noNA_noDC_regression",
...))
# GENERALIZED FOR ANY DF IN GLOBAL ENV
df_list <- Filter(function(i) class(i)=="data.frame", eapply(.GlobalEnv, function(d) d))
new_list <- lapply(df_list, function(x) ddply(x, .(Species), model_regression))

由于eapply(被environment apply)是apply系列的一部分,并且可以遍历对象,因此您可以绕过lapply。但是,必须考虑非数据帧,然后按 df 名称筛选出。因此,使用tryCatch[]索引:

new_list2 <- eapply(.GlobalEnv, function(x) 
tryCatch(ddply(x, .(Species), model_regression),
warning = function(w) return(NA),
error = function(e) return(NA)
)
)[c("I1U_melt_noNA_noDC_regression",
"I1L_melt_noNA_noDC_regression",
"I1U_melt_noNA_noDC_regression",
...)]
all.equal(new_list, new_list2)
# [1] TRUE

综上所述,理想情况下,在数据处理中,您最初将使用命名数据帧列表,而不是创建单独的、类似的结构化 16 个对象来淹没您的全局环境。因此,请考虑调整回归对象的源,因此请替换以下内容:

I1U_melt_noNA_noDC_regression <- ...

有了这个:

df_list = list()
df_list["I1U_melt_noNA_noDC_regression"] <- ...

最新更新