我正在尝试对数据框进行子集化并使用列值作为加权因子。
例如,假设我们有这些数据。
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和一个新的数据子集。
理想情况下,我会从数据中选择一个随机子集来制作新的数据帧。
任何建议都将不胜感激。
提前致谢!
答案 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),]