基于标准组合列表元素的快速方法

时间:2017-11-27 21:43:52

标签: r list apply sapply

我在R中构建一个小功能,从几个物种和几个站点进行大小测量,按站点组合所有数据(将许多物种混合在一起),然后计算这些组合数据的一些统计数据。

以下是一些简单的示例数据:

SiteID <- rep(c("D00002", "D00003", "D00004"), c(5, 2, 3))
SpeciesID <- c("CHIL", "CHIP", "GAM", "NZMS", "LUMB", "CHIL", "SIMA", "CHIP", "CHIL", "NZMS")
Counts <- data.frame(matrix(sample(0:99,200, replace = TRUE), nrow = 10, ncol = 20))
    colnames(Counts) <- paste0('B', 1:20)
spec <- cbind(SiteID, SpeciesID, Counts)
stat1 <- data.frame(unique(SiteID))
    colnames(stat1) <- 'SiteID'
    stat1$Mean <- NA

这是一个函数,它创建一个列表lsize1,其中每个列表元素是给定B1的大小(B20SpeciesID)的向量在给定的SiteID中,乘以每个大小类的计数数。由此,该函数创建了一个列表lsize2,该列表组合了lsize1中具有相同SiteID的列表元素。最后,它得到lsize2中每个元素的均值(即每个SiteID的个体的平均大小,而不管SpeciesID),并作为结果输出。

fsize <- function(){
    specB <- spec[, 3:22]
    lsize1 <- apply(specB, 1, function(x) rep(1:20, x))
        names(lsize1) <- spec$SiteID
    lsize2 <- sapply(unique(names(lsize1)), function(x) unlist(lsize1[names(lsize1) == x], use.names = FALSE), simplify = FALSE)
        stat1[stat1$SiteID %in% names(lsize2), 'Mean'] <- round(sapply(lsize2, mean), 2)
    return(stat1)
}

在创建这个函数时,我遵循了这里的建议:combine list elements based on element names,它解决了我的问题的关键:基于一些共同的标准组合列表元素(在我的例子中,组合来自同一个的所有元素{ {1}})。该功能按预期工作,但我的问题是,是否有办法使其大大加快?

注意:对于我的实际数据集,长度约为40,000行,我发现该函数在~0.7秒内运行,最耗时的步骤是创建SiteID(~0.5秒) 。我需要多次运行此函数,使用不同的数据排列和子集,因此我希望有一种方法可以显着缩短处理时间。

0 个答案:

没有答案