r - 在 R : Avoid duplicates in selection from many rows 中

标签 r random duplicates selection coding-efficiency

总结:我有一个 10 行 4 列的数组,里面填满了数字。我从每一行中选择一个数字,并希望避免选择重复。

详述: 我有一个 100*100 单元格的网格。在该网格中有 10 个包含“人”的单元格。在迭代过程中,我想让这些人在网格中“四处走动”,但我不想出现两个人同时在同一个单元格中的情况。

我有一个描述 10 个人位置的向量。它包含一个人的手机号码。这些位置在所有行和列中计数(即范围从 1:10000)。例如:位置 234 将在第 3 行第 34 列)。

Positions<-sample(1:10000,10)   #Initial positions

我所做的是首先为每个人(上、右、下、左)周围的单元格制作一个数组,为每个人提供 4 个位置:

Surroundings<-array(c(Positions+100,Positions+1,Positions-100,Positions-1),dim=c(10,4))

然后我从 Surroundings 中的每一行随机选择一个方向到向量 PosNew 中。这是我要避免重复的最后一个向量。

我可以重复 PosNew 的随机选择过程,直到它没有重复,但这可能需要很长时间。可能有更有效的方法来做到这一点。

为简单起见,我们假设人员没有离开网格并且没有其他错误发生。

我的脚本:

Positions<-sample(1:10000,10)   #Initial positions

for(i in 1:50) {
 Surroundings<-array(c(Positions+100,Positions+1,Positions-100,Positions-1),dim=c(10,4))
 PosNew<-Surroundings[cbind(1:10,sample(1:4,10,replace=TRUE))] 
 Dups<-length(which(duplicated(PosNew)==TRUE))
 Positions<-PosNew
}

我正在寻找一种方法来检查所选新位置中的重复项,并确保 Dups 永远不会超过零。欢迎提出任何建议,包括使代码更快/更高效的建议。

补充:当一个或多个人真的不能移动到一个空牢房时,我该怎么办,因为所有 4 边都被占用了?我要那个人留在原来的牢房里。如何编码?

非常感谢您的宝贵时间!

最佳答案

由于这是一个迭代过程,每个人的移动都取决于其他人的位置,我认为除了移动一个人并从所有集合的差异中采样下一个人的位置之外,你不能做得更好方向和所有占用的位置(请注意,这增加了一点不公平,因为第一个人可以说有最大的移动自由度)。

所以代码应该是这样的:

Positions <- sample(1:10000, 10)   #Initial positions

for (i in 1:50) {
  Surroundings <-
    array(c(Positions + 100, Positions + 1, Positions - 100, Positions - 1),
          dim = c(10, 4))

  # BEGIN NEW CODE
  PosNew <- numeric(10)
  for (i in 1:10) {
    # PosNew[seq_len(i-1)] is the set of occupied positions
    available <- setdiff(Surroundings[i, ], PosNew[seq_len(i-1)])
    if (length(available) != 0)
      PosNew[i] <- sample(available, 1)
    else
      PosNew[i] <- Positions[i] # stay where you are
  }
  # END NEW CODE

  Dups <- sum(duplicated(PosNew)) # shorter version - sum logical values to get a count

  Positions <- PosNew
}

希望这对您有所帮助!

关于r - 在 R : Avoid duplicates in selection from many rows 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51936589/

相关文章:

mysql - "INSERT INTO .. ON DUPLICATE KEY UPDATE"只插入新条目而不替换?

r - 获取值运行的开始和结束索引

r - 具有多种美学效果的绘图中缺少手动图例(scale_colour_manual)

R:如何根据多个条件和汇总表求和

java - 如何在android中从三个数字中获取特定的随机数

将任务分配给人员的算法,其中某些任务需要多人,并且没有人会执行同一任务两次

r - r 中的网络抓取(带循环)

javascript - 来自公共(public)照片共享网站 API 的随机图像生成器?

Python - 随机婴儿名字生成器问题 - (重复输入,调用变量)

php - Mysql中重复行的条目