我一直在这个论坛上搜索,并试图在我的情况下实现这些问题之前回答中所说的内容。但是,我的代码中缺少某些内容。
我使用 lapply() 和里面运行 ddply 的函数。这很好用。但是,我想通过读取数据框的名称来识别单个数据框的每个结果,而不是 [[1]]、[[2]]......
出于这个原因,我正在尝试实现seq_along论点,但没有成功。让我们看看我有什么:
-
我创建了一个列表,将 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)
-
后来,我成功地运行了这个 lapply() 行。
lapply(melt_noNA_noDC_regression, function(x) ddply(x, .(Species), model_regression))
-
由于我有 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"] <- ...