【发布时间】:2011-08-16 11:48:12
【问题描述】:
我正在处理一些类似图表的数据,这些数据主要收集在向量或列表中。
大多数时候,我需要通过给定的索引检查向量/列表,并执行一些逻辑来确定当前元素的结果值。
更准确地说,考虑这样一段代码:
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, j, k] <- list(c(1, 1))
}
我的问题是:
- 这是一个很好的解决方案:
- 创建索引向量,然后
- lapply 内部函数(采用索引向量)查看外部(在外部函数中声明)数据对象并使用提供的索引向量来执行逻辑
示例代码(更简单,与上面的代码无关):
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/while 循环(并且您没有大数据),那么循环就很好而且花花公子。是否有可能得到一个可重复的小例子?
-
我还没有进入衡量性能的阶段。宁愿设计 R 风格而不是一直循环。一旦我适应了正确的思维框架,我可能会想出矢量化解决方案,而无需首先进行循环思考。这就是我问的原因。不幸的是,我现在无法提供任何可重现的示例 - 我正在考虑一些一般性提示,而不是解决一个给定的问题 :) 感谢您的回复。
标签: r