具有加权因子的子集数据
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),]
我正在尝试对数据框进行子集化并使用列值作为权重因子。
例如,假设我们有这些数据。
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),]