Как лучше написать этот вложенный цикл for в R? - PullRequest
0 голосов
/ 28 октября 2018

Я пишу цикл 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)

    }

  }

1 Ответ

0 голосов
/ 28 октября 2018

Используйте следующие данные игрушки для проверки результата.

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

Наиболее очевидная «векторизация»:

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

Возможно, проблема с памятью, если n > 5000.


Умный обходной путь (использование симметрии; более эффективная память "векторизация"):

## see https://stackoverflow.com/a/52086291/4891738 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 ++, который я не буду демонстрировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...