Присвоение значений вектору в цикле (R) - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть матрица:

x1j1 = c(6,6,18,8,11,34,28,71,43,33,20)
x1j2 = c(27,23, 64,44,30,75,26,124,54,30,14)
x2j1 = c(25,28,36,35,15,44,42,54,34,29,39)
x2j2 = c(15,13,22,29,31,64,30,64,56,20,21)

x61 = cbind(x1j1,x1j2,x2j1,x2j2)

Мне нужно найти отличия элементов x1j1-x2j1 и x2j1-x2j2.

Код, который у меня есть:

dj1 = c()
dj2 = c()

for (i in 1:nrow(x61)) {
    dj1 <- x1j1[i] - x2j1[i]
    dj2 <- x1j2[i] - x2j2[i]
}

Ответ, который я получаю, - это только разница между первыми элементами:

> dj1
[1] -19
> dj2
[1] -7

Как создать векторы с различиями соответствующих значений?

1 Ответ

0 голосов
/ 18 ноября 2018

Вы на самом деле уже знаете, как (хотя ваш код использует разные переменные, поэтому нет согласованности):

x1j1 - x2j1
#  [1] -19 -22 -18 -27  -4 -10 -14  17   9   4 -19
x2j1 - x2j2
#  [1]  10  15  14   6 -16 -20  12 -10 -22   9  18

Это потому, что вычитание - это векторизованная операция в R, что означает, что она позволяет работать с векторами напрямую.

В целях обучения цикл можно записать следующим образом

dj1 <- dj2 <- numeric(nrow(x61))

for (i in 1:nrow(x61)) {
  dj1[i] <- x1j1[i] - x2j1[i]
  dj2[i] <- x1j2[i] - x2j2[i]
}

Я определил dj1 и dj2 как пустые векторы заданной длины (для эффективности). Затем, так же, как вы используете x1j1[i] для просмотра определенного элемента, вам нужно использовать dj1[i] для обновления определенного элемента.

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