【问题标题】:Create data frames sampling randomly based on conditions at 2 columns根据 2 列的条件创建随机抽样的数据帧
【发布时间】:2019-11-18 11:44:21
【问题描述】:

我有一个包含 10,000,000 行和 5 列的数据框 A,如下所示:

SNP REC AF X Y Z
rs1 2.3 0.22 sss ff 472
rs200 4.7 0.7 d tg 634
rs33 30.1 0.5 ddf ap 929

使用 R,我想生成 50 个新数据帧,其中包含 A 中的所有列,按以下方式循环前 50 行。

对于 REC,AF 列中的每个 i,j,从满足以下 2 个条件的 A(带放回抽样)中选择 1000 个随机行:

1) i-2.5 < i < i+2.5 # i = value in REC
2) j-0.05 < j < j+0.05 # j = value in AF

例如;对于第 1 行:在 A 中选择 1000 个随机行,其中 REC 介于 -0.2 和 4.8 之间,AF 介于 0.17 和 0.27 之间;对于第 2 行:在 A 中选择 1000 个随机行,其中 REC 介于 2.2 和 7.2 之间,AF 介于 0.65 和 0.75 之间; ...对于第 50 行:...;等等

我知道如何使用示例函数:

A[sample(nrow(A), 1000,replace = TRUE), ]

但我不知道如何自动化该功能。

非常欢迎任何建议!

【问题讨论】:

  • 不清楚。 iREC 中的每个值?你能显示预期 daatframe 的前几行吗?
  • 嗨@RonakShah。是的,i 适用于 REC 中的每个值(循环遍历 A 的前 50 行,但从整个 A 中采样满足 2 个条件的行)。请参阅编辑。谢谢!

标签: r dataframe random conditional-statements


【解决方案1】:

我们可以在这里使用Map。仅前 50 个值的子集 RECAF,找出符合条件的范围内的索引和 sample 1000 行。

Map(function(i, j) df[sample(which(df$REC > (i - 2.5)  &  df$REC < (i + 2.5) &
           df$AF > (j - 0.05)  &  df$AF < (j + 0.05)), 1000, replace = TRUE), ],
      df$REC[1:50], df$AF[1:50])

【讨论】:

  • 非常感谢@Ronak Shah!。请问您是如何从该函数中提取 50 个数据帧的?
  • @Lucas 将该函数的输出存储在一个对象中。说lstlst &lt;- Map(function(i, j) df........... 也是如此。现在您可以使用lst[[1]]lst[[2]] 来提取单个数据帧。
猜你喜欢
  • 2014-06-22
  • 2015-08-16
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多