随机采样具有给定权重(频率)的数据帧行
Posted
技术标签:
【中文标题】随机采样具有给定权重(频率)的数据帧行【英文标题】:Randomly sample rows of data frame with given weights (frequency) 【发布时间】:2018-02-01 21:24:34 【问题描述】:我有一个格式如下的数据框:一列包含原始序列,另一列包含序列出现的次数,其他列具有其他特征。
c1 <- c(324, 213, 122, 34)
c2 <- c("SDOIHHFOEKN", "SDIUFONBSD", "DSLIHFEIHDFS", "DOOIUDBD")
c3 <- c("G", "T", "U", "T")
df <- data.frame(count = c1, seq = c2, other = c3)
我的实际数据框有超过 10^6 行和 20 列。
我想从中随机采样 N 个序列,同时保持上面的数据帧结构。例如,我想从上述数据帧中随机抽取 300 个序列。理论上,此处存在的四个唯一序列的比率应保留在最终数据框中。
这种随机抽样是如何发生的?我正在考虑使用 reshape::untable
扩展数据框,然后使用随机数生成器和 grep 来获取行,但是我无法将其恢复为初始数据框格式,每行都有唯一的序列和计数该序列出现了多少次。
谢谢!
【问题讨论】:
sample
允许概率,所以你可以尝试类似:sample(c2, 300, replace = TRUE, prob = c1 / sum(c1))
@MikeH。我怎样才能得到最终数据帧中每个序列的实际计数呢?这将使相对频率保持不变,但不会给我一个绝对计数。谢谢!
您要对序列进行采样,然后对样本进行计数?
【参考方案1】:
使用 sample.int 来提高速度:
sampled_df <- df[sample.int(nrow(df), 300, replace = TRUE, prob = df$count),] %>%
group_by(seq) %>%
summarize(count = n(), other=unique(other)) %>%
as.data.frame
> sampled_df
seq count other
1 DOOIUDBD 21 T
2 DSLIHFEIHDFS 53 U
3 SDIUFONBSD 102 T
4 SDOIHHFOEKN 124 G
【讨论】:
如果我还有 18 个其他列也特定于每个序列,这将如何工作?我在这里看到您必须特别提及other
,但对于其他 18 个变量,我不希望这样做。谢谢!
我可以看到两种方法:如果您想深入了解 dplyr,可以查看 dplyr summarize_at
或 summarize_all
。否则,您可以将 merge
新的 data.frame 与原始数据一起使用,使用 seq
作为键。我更喜欢第二种方法,因为它只是注释并且不太复杂。以上是关于随机采样具有给定权重(频率)的数据帧行的主要内容,如果未能解决你的问题,请参考以下文章