Я работаю с 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
например, потому что время выполнения очень длинно.
Спасибо
Внутренний цикл может быть векторизован
cluster[i,4] <- paths[max(which(data[i]==paths[,1])),2]
, но проверьте комментарий Мусы. Я думаю, что вы сделали отступ от чего-то еще.
Второй (внешний) цикл тоже можно векторизовать, реплицируя векторы, но
i
только 100, то скорость не будет большой[edit] Как я понял ваш комментарий, вы можете просто использовать логическое индексирование?
indx <- data==paths[, 1]
cluster[indx, 4] <- paths[indx, 2]
Я думаю, что оба цикла можно векторизовать, используя следующее:
cluster[na.omit(match(paths[1:100,1],data[1:10])),4] = paths[!is.na(match(paths[1:100,1],data[1:10])),2]