【问题标题】:Is there an easier way to create this vector that doesn't require loops?有没有更简单的方法来创建不需要循环的这个向量?
【发布时间】:2019-07-05 14:53:10
【问题描述】:

我正在尝试创建一个配对值的向量。例如,如果第 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 个进行配对是行不通的。

【问题讨论】:

  • 对象v1a 不是向量,而是长度为1 的数字。我不明白你想要的输出是什么?也许发布一个只有 10 个组件而不是 10^5 的较小示例。
  • 我不是反对者,但我对你想要完成的事情有点困惑。似乎您设置了 v1,然后从不对其进行任何操作。您能否尝试添加更多关于操作的语言(也许是一个完整的更小的示例?)
  • 对不起!我设法我不小心复制了我在 for 循环中的 mapply 版本中使用的代码的混合,这显然没有意义。

标签: r loops optimization


【解决方案1】:

如果我对你的理解正确的话,你可以这样做

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

【讨论】:

  • 这正是我想要的,而且花费的时间少得多!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多