在 R 中编写这个嵌套 for 循环的更好方法是什么?

What is a better way to write this nested for loop in R?

我正在编写一个 for 循环来计算一个分子,它是一个更大公式的一部分。我使用了一个 for 循环,但它需要花费很多时间来计算。什么是更好的方法来做到这一点。

city 是一个包含以下列的数据框:pop, not.white, pct.not.white

  n <- nrow(city)

  numerator = 0

  for(i in 1:n) {

    ti <- city$pop[i]
    pi<- city$pct.not.white[i]

    for(j in 1:n) {

      tj <- city$pop[j]
      pj <- city$pct.not.white[j]

      numerator = numerator + (ti * tj) * abs(pi -pj)

    }

  }

使用以下玩具数据进行结果验证。

set.seed(0)
city <- data.frame(pop = runif(101), pct.not.white = runif(101))

最明显的"vectorization":

# n <- nrow(city)
titj <- tcrossprod(city$pop)
pipj <- outer(city$pct.not.white, city$pct.not.white, "-")
numerator <- sum(titj * abs(pipj))

如果n > 5000可能会有内存问题。


巧妙的解决方法(利用对称性;更高效的内存 "vectorization"):

## see  for function: tri_ind
n <- nrow(city)
ij <- tri_ind(n, lower = TRUE, diag = FALSE)
titj <- city$pop[ij$i] * city$pop[ij$j]
pipj <- abs(city$pct.not.white[ij$i] - city$pct.not.white[ij$j])
numerator <- 2 * crossprod(titj, pipj)[1]

最终解决方案是写C/C++循环,我就不展示了。