кондиционирование с векторами - PullRequest
1 голос
/ 17 мая 2011

Я новичок в р.

У меня есть вектор (длиной 100) упорядоченных пар.У меня также есть вектор (также длиной 100) из 1 и 0.Я хотел бы «переставить» упорядоченные пары всякий раз, когда другой вектор имеет 1 в той же позиции, и оставить его не перевернутым, когда есть 0. Я пытался (наивно и безнадежно)

for (i in 1:100) {
  if (flip[i]=1) {
    pair[i,] = rev(pair[i,])
  } else {
    pair[i,] = pair[i,]
  }
}

Я также пробовал это с различными скобками вокруг утверждений

Пожалуйста, помогите.

Ответы [ 2 ]

4 голосов
/ 17 мая 2011

Ваш код не работает, потому что = используется для назначения, а == используется для логического сравнения.Это работает:

flip = sample(c(0,1), 100, replace=TRUE)
pair = array(1:200, dim=c(100,2))

for (i in 1:100) {
  if (flip[i]==1) {
    pair[i,] = rev(pair[i,])
  } else {
    pair[i,] = pair[i,]
  }
}

Тем не менее, есть удобные векторизованные решения этого типа проблемы (как продемонстрировал @Prasad).

3 голосов
/ 17 мая 2011

Возьмите небольшой пример:

pair <- matrix(1:10,5,2)
flip <- c(1, 0, 0, 1, 0)
> pair
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

Затем вы можете перевернуть нужные строки pair, используя:

pair[flip==1,] <-  pair[ flip == 1, 2:1 ]

> pair
     [,1] [,2]
[1,]    6    1
[2,]    2    7
[3,]    3    8
[4,]    9    4
[5,]    5   10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...