结合lapply,seq_along和ddply

时间:2018-03-16 12:06:18

标签: r lapply

我一直在搜索这个论坛,并试图在我的案例中实现这些问题的先前答案所说的内容。但是,我的代码中缺少某些内容。

我使用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]])
    })
    
  4. 但是,我一直在犯错,而且有点令人沮丧。这可能很容易解决,但我是阻止。

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

1 个答案:

答案 0 :(得分:2)

考虑使用eapplylapply不太知名的兄弟姐妹)或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"] <- ...