我一直在搜索这个论坛,并试图在我的案例中实现这些问题的先前答案所说的内容。但是,我的代码中缺少某些内容。
我使用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]])
})
但是,我一直在犯错,而且有点令人沮丧。这可能很容易解决,但我是阻止。
有什么想法解决这个问题吗?
答案 0 :(得分:2)
考虑使用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
( e 环境应用)是申请系列的一部分并且可以遍历对象,因此您可以绕过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"] <- ...