【问题标题】:Combine lapply, seq_along and ddply结合 lapply、seq_along 和 ddply
【发布时间】:2018-08-25 11:59:36
【问题描述】:

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

我使用 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]])
    })
    

但是,我不断收到错误,这有点令人沮丧。这可能很容易解决,但我被阻止了。

有办法解决这个问题吗?

【问题讨论】:

  • 您是否尝试在第一步中使用命名列表? lapply 保留列表元素的名称,您可以稍后使用这些名称访问特定结果。

标签: r lapply


【解决方案1】:

考虑使用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(即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 个对象来淹没您的全局环境。因此,请考虑调整 regression 对象的来源,因此替换以下内容:

I1U_melt_noNA_noDC_regression <- ...

用这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多