По мере того, как вы продвигаетесь в изучении R, вам следует знать одну особенность: векторизация .Многие операции, которые (скажем, в C) должны были бы выполняться в цикле, могут быть одновременно перенесены в R. Это особенно верно, когда у вас есть вектор / матрица / массив и скаляр, и вы хотите выполнить операцию междуих.
Допустим, вы хотите добавить 2 к вектору myvector
.C / C ++ способ сделать это в R будет использовать цикл:
for ( i in 1:length(myvector) )
myvector[i] = myvector[i] + 2
Так как R имеет векторизация , вы можете сделать сложение вообще без цикла, то есть, добавить скаляр к вектору :
myvector = myvector + 2
Векторизация означает, что цикл выполняется внутренне.Это гораздо эффективнее, чем писать цикл внутри самого R!(Если вы когда-либо делали какие-либо Matlab или python / numpy, это примерно то же самое в этом смысле.)
Я знаю, что вы новичок в R, так что это немного сбивает с толку, но просто имейте в виду, что часто циклыможет быть исключен в R.
Имея это в виду, давайте посмотрим на ваш код:
Инициализация от count
до 0 может быть выполнена при создании, поэтому первый цикл не требуется.
count = matrix(0,ncol=1,nrow=tt)
Во-вторых, из-за векторизации вы можете сравнить вектор со скаляром.Таким образом, для вашего внутреннего цикла в i вместо цикла column
и выполнения if column[i]==j
вы можете выполнить idx = (column==j)
.Это возвращает вектор, который равен TRUE
, где column[i]==j
и FALSE
в противном случае.
Чтобы найти, сколько элементов column
равно j
, мы просто посчитаем, сколько TRUE
сесть в idx
.То есть мы делаем sum(idx)
.
Таким образом, ваш двойной цикл можно переписать так:
for ( j in 1:tt ) {
idx = (column == j)
count[j] = sum(idx) # no need to add
}
Теперь даже можно удалить внешний цикл в j
, используяфункция sapply
:
sapply( 1:tt, function(j) sum(column==j) )
Приведенная выше строка кода означает: «для каждого j в 1: tt, return function (j)», return возвращает вектор, где j'-й элемент являетсярезультат функции.
Итак, в итоге, вы можете уменьшить весь код до:
count = sapply( 1:tt, function(j) sum(column==j) )
(хотя это не объясняет вашу ошибку, которую яподозреваемый имеет отношение к конструкции или классу вашего column
).