Избегайте использования для циклов

Я работаю с R и у меня есть код как это:

for (i in 1:10)
   for (j in 1:100)
        if (data[i] == paths[j,1])
            cluster[i,4] <- paths[j,2]

где:

  • data вектор с 100 строками и 1 столбец
  • paths матрица с 100 строками и 5 столбцов
  • cluster матрица с 100 строками и 5 столбцов

Мой вопрос: как я мог избежать использования того, "чтобы" циклы выполнили итерации через матрицу? Я не знаю ли apply функции (lapply, tapply...) полезны в этом случае.

Это - проблема когда j=10000 например, потому что время выполнения очень длинно.

Спасибо

1
задан patL 9 February 2018 в 14:28
поделиться

2 ответа

Внутренний цикл может быть векторизован

cluster[i,4] <- paths[max(which(data[i]==paths[,1])),2]

, но проверьте комментарий Мусы. Я думаю, что вы сделали отступ от чего-то еще.

Второй (внешний) цикл тоже можно векторизовать, реплицируя векторы, но

  1. если i только 100, то скорость не будет большой
  2. потребуется больше оперативной памяти

[edit] Как я понял ваш комментарий, вы можете просто использовать логическое индексирование?

indx <- data==paths[, 1]
cluster[indx, 4] <- paths[indx, 2]
1
ответ дан 3 September 2019 в 00:07
поделиться

Я думаю, что оба цикла можно векторизовать, используя следующее:

cluster[na.omit(match(paths[1:100,1],data[1:10])),4] = paths[!is.na(match(paths[1:100,1],data[1:10])),2]
1
ответ дан 3 September 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: