Запись результатов из вложенного цикла в другой вектор в R - PullRequest
0 голосов
/ 03 октября 2011

Я довольно новичок в R и немного борюсь с этим.У меня есть следующий код:

repeat {
    if (t > 1000) 
        break
    else {
        y1 <- rpois(50, 15)
        y2 <- rpois(50, 15)
        y <- c(y1, y2)
        p_0y <- matrix(nrow = max(y) - min(y), ncol = 1)
        i = min(y)
        while (i <= max(y)) {
            p_0y[i - min(y), ] = (length(which(y1 == i))/50)
            i <- i + 1
        }
        p_y <- matrix(nrow = max(y) - min(y), ncol = 1)
        j = min(y)
        while (j <= max(y)) {
            p_y[j - min(y), ] = (length(which(y == j))/100)
            j <- j + 1
        }
        p_0yx <- p_0y[rowSums(p_0y == 0) == 0]
        p_yx <- p_y[rowSums(p_0y == 0) == 0]
        g = 0
        logvect <- matrix(nrow = (length(p_yx)), ncol = 1)
        while (g <= (length(p_yx))) {
            logvect[g, ] = (p_0yx[g])/(p_yx[g])
            g <- g + 1
        }
        p_0yx %*% (log2(logvect))
        print(p_0yx %*% (log2(logvect)))
        t <- t + 1
    }
}

Я доволен всем до последней строки, но вместо вывода значения p_0yx% *% (log2 (logvect)) на экран я хотел бысохранить это как еще один вектор.есть идеи?Я пытался сделать это так же, как во вложенном цикле, но, похоже, не работает.

Спасибо

1 Ответ

6 голосов
/ 03 октября 2011

Краткий ответ - сначала объявить переменную. Поместите это перед всем, что вы разместили здесь. Я собираюсь назвать это темп. Он будет содержать все значения.

temp <- numeric(1000)

Тогда вместо строки печати используйте

temp[t] <- p_0yx %*% log2(logvect)

Кстати, ваш код делает странные вещи. Посмотрите на первый индекс p_0y. Фактически это индекс для элемента 0, в этой матрице. Индекс R начинается с 1. Когда вы создаете количество строк в этой матрице, вы используете max(y) - min(y). Если максимальное значение равно 10, а минимальное значение равно 1, тогда есть только 9 строк. Бьюсь об заклад, вы действительно хотели добавить один. Кроме того, ваш код очень не похож на R со всеми ненужными циклами while. Например, весь ваш последний цикл (и инициализация logvect) можно заменить на:

logvect = (p_0yx)/(p_yx)

Но вернемся к ошибкам ... и еще немного Ресс ... мог бы следующий код ...

p_0y <- matrix(nrow = max(y) - min(y), ncol = 1)
i = min(y)
while (i <= max(y)) {
    p_0y[i - min(y), ] = (length(which(y1 == i))/50)
    i <- i + 1
    }

может быть правильнее заменить на?

p_0y <- numeric(max(y) - min(y) + 1)
p_0y[sort(unique(y1)) - min(y1) + 1] = table(y1)/50
p_0y <- matrix(p_0y, ncol = 1)

(подобное переосмысление остальной части вашего кода может также устранить и остальные циклы)

...