有没有更简单的方法来创建不需要循环的向量?

时间:2019-07-05 14:53:10

标签: r loops optimization

我正在尝试制作一个将值配对的向量。例如,如果第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]
  }
}

基本上所有方法都有效,只是花费的时间太长。我确信必须有一种更优化的方法。

我需要配对是随机的,所以首先要配对5万,然后再配对5万就行了。

1 个答案:

答案 0 :(得分:0)

也许如果我对您的理解正确,就可以做到

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