具有加权因子的子集数据

Subset data with a weighting factor

我正在尝试对数据框进行子集化并使用列值作为权重因子。

例如,假设我们有这些数据。

set.seed(123)
Data <- data.frame(x1 = sample(c(0,1),100, replace = T), x2 = round(runif(100, min=0, max=100),0), Prob = round(runif(100),2))
head(Data)

> head(Data)
  x1 x2 Prob
1  0 60 0.24
2  1 33 0.96
3  0 49 0.60
4  1 95 0.52
5  1 48 0.40
6  0 89 0.88

其中 x1 和 x2 是简单的占位符,Prob 表示数据中的值无效或无法观察到的概率。从 Data 我想生成 5 个不同的子集。新数据框将包含 Data 中 90%、80%、70%、60% 和 50% 的行。换句话说,我想删除 10%、20%、30%、40% 和 50% 的数据,并制作 5 个新子集。

困难在于我想使用Prob字段作为权重因子。 Prob 值较高的行在新数据子集中出现的次数应该较少。

例如,当创建新的数据子集时,Prob 的 0.24 将有 24% 的机会不被 selected。 Prob 值为 0.96 将有 96% 的 NOT 和一个新的数据子集。

理想情况下,我会 select 来自 Data 的随机子集来制作新的数据帧。

如有任何建议,我们将不胜感激。

提前致谢!

我不确定你到底想做什么。但是,我认为您想使用 rbinom 函数。

要模拟一种结果,您可以使用以下代码:

simOne = sapply(1 - Data$Prob, rbinom, size = 1, n = 1)
head(simOne)
# [1] 1 0 1 0 1 0

需要1 -,因为你有失败的概率,但你需要成功的概率。接下来在原始矩阵中使用 simOne

Data[simOne > 0, ]
head(Data[simOne > 0, ] )
#  x1 x2 Prob
#   0 60 0.24
#   0 49 0.60
#   1 48 0.40
#   1 91 0.36
#   1 61 0.29
#   1 41 0.17

根据你的问题,我不确定你接下来要做什么。如果您澄清,我很乐意在您的下一步中编辑我的答案。如果您想生成许多不同的样本,如果您一次对所有样本进行采样,您的代码将运行得更快:

n 个样本 = 10 ## 模拟包含概率 simMany = sapply(1 - Data$Prob, rbinom, size = 1, n = nSamples)

请注意,您可能需要转置 (t(simMany)),具体取决于您的使用方式。

您需要使用如下内容:

new_data <- Data[sample(nrow(Data), N, prob = (1 - Data$Prob), replace = F),]