【问题标题】:How do I both randomly select rows from a data frame and delete each row as it has been selected? [duplicate]如何从数据框中随机选择行并删除已选择的每一行? [复制]
【发布时间】:2020-12-03 22:33:07
【问题描述】:

我从由单列组成的数据框中随机抽样而不进行替换。此列包含重复的数值。

我正在使用dplyr 来执行此操作。我需要从中采样的数据如下所示:

testSO <- data.frame(ToSample = c(round(runif(100, min=1, max=3),0)))

我使用下面的代码随机抽取 15 行:

MyRandomSample <- testSO %>%
slice_sample(n=15, replace = FALSE)

是否有直接的方法可以从testSO 中删除这 15 个样本中的每一个样本?实际上,slice_sample 正在幕后做这件事。我找不到创建行索引列表以便能够从testSO 中删除这些的方法。然后我会简单地删除与行索引匹配的行。

真实的testSO 数据有一些排序效果,因此我使用slice_sample 而不是slice_head

我可以随机重新排序testSO,然后再重新排序slice_head。但是有没有一种既可以抽取样本又可以同时删除抽样行的方法?我找到了一个使用-sample 的基本 R 方法,它从数据框中删除行,但它不会将删除的行传递给另一个对象。

【问题讨论】:

  • 有几种方法可以检索然后删除这些采样帧:(1) 如果每一行都有唯一标识符(或保证唯一匹配的列组合) ,那么你可以anti_join在那个id上带有随机样本帧的原始帧; (2) 不能使用slice_sample,但可以mutate(use = row_number() %in% sample(n(), size=15))filter(use) 检索,然后用filter(!use) 删除。

标签: r random dplyr


【解决方案1】:

您可以随机绘制行索引,并将它们用于选择随机样本以及从原始数据中删除它们。

rand_ind <- sample(nrow(testSO), 15, replace = FALSE) 
MyRandomSample <- testSO[rand_ind, ]
testSO <- testSO[-rand_ind, ]

【讨论】:

  • 谢谢。我想必须有办法做到这一点。基地 R 来救援!
猜你喜欢
  • 2016-02-26
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 2021-05-11
相关资源
最近更新 更多