微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

避免循环,但保留索引信息

如何解决避免循环,但保留索引信息

| 我正在处理一些类似图形的数据,这些数据大多收集在矢量或列表中。 大多数时候,我需要检查给定索引的向量/列表,并做一些逻辑以确定当前元素的结果值。 为了更精确一点,请考虑以下代码片段:
for (i in 1:(length1 - 1))
    for (j in (i + 1):length2)
        for (k in 1:length3) {
            d1 <- data[i,k]
            d2 <- data[j,k]
            if (d1 != d2)
                otherData[i,j,k] <- list(c(min(d1,d2),max(d1,d2)))
            else
                otherData[i,k] <- list(c(1,1))
        }
我的问题是: -这是一个好的解决方案: 创建索引向量,然后 l应用内部函数(采用索引向量),该函数查看外部(在外部函数中声明)数据对象,并使用提供的索引向量执行逻辑 示例代码(更简单,与上面的代码无关联):
someFunc <- function(data) {
    n <- length(data)
    f <- function(i) {
        return (doSthWith(data[i],i))
        # do some logic with both the data and the index
    }
    return (sapply(1:n,f))
}
我想到的另一种解决方案是创建一个data.frame并将索引作为数据的一部分,因此lapply函数基本上也将索引包含在输入行中。 对于您对这些方法的想法,我将非常感激。     

解决方法

好吧,您可以进行矢量化索引编制,这应该为您提供显着加速的机会。通常,代替:
for(a in A) for(b in B) something(x[a,b])
你可以做:
something_vectorized(x[as.matrix(expand.grid(A,B))])
* apply基本上是循环包装器,因此通过将循环转换为循环包装器,您将获得最多清晰的代码。 编辑:补充说明的小插图:
> system.time(replicate(100,sum(sapply(1:1000,function(x) x^2))))
   user  system elapsed 
  0.385   0.001   0.388 
> system.time(replicate(100,sum((1:1000)^2)))
   user  system elapsed 
  0.002   0.001   0.003
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。