отсутствует значение, где TRUE / FALSE нужна ошибка в R - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть столбец с разными числами (от 1 до tt), и я хотел бы использовать цикл для подсчета появления этих чисел в R.

count = matrix(ncol=1,nrow=tt) #creating an empty matrix
for (j in 1:tt)
{count[j] = 0} #initiate count at 0



for (j in 1:tt) 
 {
  for (i in 1:N) #for each observation (1 to N)
    {
        if (column[i] == j) 
           {count[j] = count[j] + 1 }

     }
  }

К сожалению, я продолжаю получать этоошибка.

Error in if (column[i] == j) { : 
missing value where TRUE/FALSE needed

Итак, я попытался:

for (i in 1:N) #from obs 1 to obs N
if (column[i] = 1) print("Test")

Я в основном получил ту же ошибку.

Пытался провести небольшое исследование этой ошибки, и многие должны были сказать об «отладке», с которой я не знаком.

Надеюсь, кто-то может сказать мне, что здесь происходит.Спасибо!

Ответы [ 2 ]

1 голос
/ 18 января 2012

По мере того, как вы продвигаетесь в изучении 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).

0 голосов
/ 18 января 2012

Я предлагаю не использовать циклы for, но использовать функцию count из пакета plyr. Эта функция делает именно то, что вы хотите в одной строке кода.

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