【问题标题】:Preventing some some elements from being `sample()`ed in a for loop防止某些元素在 for 循环中被 `sample()`ed
【发布时间】:2021-12-11 09:29:38
【问题描述】:

下面我的for 循环使用time_to_remove 中的元素随机删除它们study。要删除的time 的可用元素是:2, 3, 4

但问题不大。 time 元素有顺序。因此,在 sample() 删除之后,我们不能以:time = 0,1,3time = 0,1,2,4 等结束。我们只能以:time = 0,1time = 0,1,2time=0,1,2,3time=0,1,2,3,4 结束。

我想知道这样的条件是否可以添加到我下面的当前代码中?

library(tidyverse)
data <- expand_grid(study=1:4,group=1:2, time=0:4)

n = 1
time_to_remove <- unique(data$time)[-(1:2)]
unique_study <- unique(data$study)

for(i in time_to_remove) {
  studies_to_remove = sample(unique_study, size = n)
  time_to_remove = i
  unique_study <- setdiff(unique_study, studies_to_remove)
  data <- data %>%
    filter(
      !(   study %in% studies_to_remove &
            time %in% time_to_remove ))
}
data %>% as.data.frame()

【问题讨论】:

  • time %in% time_to_remove 更改为time &gt;= time_to_remove
  • @GregorThomas,非常感谢!当我多次运行这个循环时,我似乎从来没有看到只有time = 0:1time=0:2 的研究。有没有办法增加这种可能性?
  • 删除您的time_to_remove 中的[-(1:2)]。也许保留为[-1],很难确定...
  • @GregorThomas,嗯,这是一个必须保留的限制(我们不能在没有时间 0 和 1 的情况下进行研究)。因为一开始所有研究看起来都完全一样,time=0:4 的研究过多似乎有点奇怪。
  • time_to_remove = i ... 使用与被迭代的变量相同的名称不是一个好主意。相反,只需使用i

标签: r dataframe loops random tidyverse


【解决方案1】:

我知道这不是答案。但是提问者想知道如果他尝试使用我的评论,代码会是什么样子:

for(i in time_to_remove) {
  studies_to_remove = sample(unique_study, size = n)
     # time_to_remove = i
  unique_study <- setdiff(unique_study, studies_to_remove)
  data <- data %>%
    filter(
      !(   study %in% studies_to_remove &
            time > i ))
}

【讨论】:

  • 我很感激 (+1)。
  • 我也接受了这一点,但确实有一个真正的问题:如果你不断增加n,那么for 循环内的sample() 调用会中断并抛出一个错误n 大于 unique_study。为了防止这种情况,我们可以在内部将n 更改为最近的不可破解数字吗?
猜你喜欢
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 2020-11-29
  • 2021-05-15
相关资源
最近更新 更多