【问题标题】:How to sample a column based on frequency in R?如何根据R中的频率对列进行采样?
【发布时间】:2019-03-19 22:52:12
【问题描述】:

目前有以下数据表

如您所见,1 发生的概率是 30%,2 是 50%,3 是 20%

我想根据该概率对该列中的值进行采样

所以我想要这样的东西

如您所见 - 前两列不受影响

关于如何做到这一点的任何想法 - 我认为示例函数会有所帮助,但不确定如何使其工作

【问题讨论】:

  • 能详细解释一下col3的逻辑吗?
  • 我刚刚创建了 i 作为示例。它只包含这 3 个值,而概率是我创建的
  • 没有其他行 - 我如何根据值出现的概率重新排列该列中的值 - 所以我希望 2 出现 50% 的时间 - 这里的例子是5次,让大家更容易理解!
  • df$col3 <- sample(df$col3) ?
  • ?^ 下面给出答案!

标签: r tidyverse


【解决方案1】:

最简单的方法就是洗牌...

df$col3 <- sample(df$col3)

【讨论】:

  • 我需要像他们一样经常发生的概率吗?这个工作例如 1 必须只出现 30% 的时间吗?
  • 是的,col3 将包含完全相同的数字,只是顺序不同,因此频率必须相同。
  • 如果我在 col3 中具有相同的值,具有相同的概率但有 100 行,这会起作用吗?我想要的只是概率与行增加相同 - 所以如果 100 行那么 2 应该出现 50% 的时间?
【解决方案2】:

如果您想重新创建具有所需概率的列,而不是仅仅改变其当前值:

df$col3sample <- sapply(1:nrow(df), function(x) sample(3, size=1, prob=c(0.3, 0.5, 0.2), replace=TRUE))

这将在df 中创建一个新列,为以概率 0.3/0.5/0.2 绘制的每一行分配 1、2 或 3。

   col1   col2 col3 col3sample
1    ab    red    2          3
2    as   blue    1          1
3    ad  green    2          2
4    af orange    1          2
5    ag  black    2          2
6    ah    red    1          1
7    aw  green    2          2
8    we orange    3          3
9    wr  black    2          1
10   et  white    3          2

但是,这确实允许概率分布发生一些随机变化,因此您可能需要采集一些样本才能使其恰好为 30% 1s、50% 2s 和 20% 3s。

【讨论】:

  • 如果您能详细说明一下解决方案,将会很有帮助。这可能作为一个单行,但可能更难缠住你的头。
  • 我添加了一些额外的解释和输出。
猜你喜欢
  • 2022-07-26
  • 2020-01-18
  • 2013-11-09
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多