Есть ли более простой способ создать этот вектор, который не требует циклов? - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь создать один вектор, который объединяет значения.Например, если 2-й элемент равен 100, я хочу, чтобы 100-й элемент был равен 2. В каком-то смысле каждый элемент вектора имеет свою собственную соответствующую пару.

Я использую этот вектор в функции позже.

В настоящее время я пытался работать с циклом mapply и for аналогичным образом, но это занимает слишком много времени, и я продолжаю думать, что для этого должен быть более оптимальный способ.Возможно, вариация функции семпла?

Мне нужен «спаренный» вектор длиной 10 ^ 5

set.seed(1)

tmp <- 1:10^5
t1 <- c(sample(1:10^5, 5))
t2 <- tmp[-t1]
t2 <- sample(t2)

for (i in 1:10^5) {
  if (tmp[i] %in% t1) {
    a <- which(t1 == tmp[i])
    tmp[i] <- t2[a]
  } else {
    a <- which(t2 ==tmp[i])
    tmp[i] <- t1[a]
  }
}

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

Мне нужно, чтобы спаривания были случайными, поэтому выполнение их за первые 50 000, а затем остальные 50 000 не сработают.

1 Ответ

0 голосов
/ 05 июля 2019

Может быть, если я вас правильно понял, вы можете сделать

tmp <- 1:100
t1 <- sample(1:100, 50)
t2 <- tmp[-t1]
t2 <- sample(t2)


v2 <- integer(100)
v2[t1] <- t2
v2[t2] <- t1

Это по сравнению с вашей for петлей дает тот же результат

for(i in 1:100) {
  if(tmp[i] %in% t1) {
    a <- which(t1 == tmp[i])
    v1[i] <- t2[a]
   }  else {
     a <- which(t2 ==tmp[i])
     v1[i] <- t1[a]
   }
}

identical(v1, v2)
#[1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...