具有加权因子的子集数据

时间:2015-05-02 23:12:56

标签: r subset

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

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

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%的机会未被选中。 Prob值为0.96将有96%的NOT和一个新的数据子集。

理想情况下,我会从数据中选择一个随机子集来制作新的数据帧。

任何建议都将不胜感激。

提前致谢!

2 个答案:

答案 0 :(得分:2)

我不确定你到底想要做什么。但是,我认为您想使用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

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

nSamples = 10    ##模拟包含的可能性    simMany = sapply(1 - Data $ Prob,rbinom,size = 1,n = nSamples)

请注意,您可能需要转置(t(simMany)),具体取决于您希望如何使用它。

答案 1 :(得分:2)

您需要使用以下内容:

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