随机采样具有给定权重(频率)的数据帧行

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_atsummarize_all。否则,您可以将 merge 新的 data.frame 与原始数据一起使用,使用 seq 作为键。我更喜欢第二种方法,因为它只是注释并且不太复杂。

以上是关于随机采样具有给定权重(频率)的数据帧行的主要内容,如果未能解决你的问题,请参考以下文章

信号频率、采样频率、采样点数

libfdk_aac音频采样率和编码字节数注意

音频 属性详解(涉及采样率通道数位数比特率帧等)

python中数据的随机采样

谁能说采样率和帧大小是如何相关的?

你怎么能得到iphone加速度计的采样率频率?