R 加权抽样程序
R Weighted Sampling Procedures
data1=data.frame("School"=c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5),
"Group"=c(1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2),
"Class"=c('A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C'),
"Size"=c(459,441,410,201,327,156,129,427,249,331,477,458,288,472,275,449,424,469,386,387,103,320,284,277,481,167,348,247,115,193))
data2=data.frame("ID"=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30),
"Group"=c(2,2,2,2,1,1,1,2,2,2,2,2,2,1,1,2,1,2,1,1,2,2,2,2,2,1,1,1,1,1),
"Class"=c('A','B','C','B','C','C','A','A','A','B','B','A','B','A','C','C','B','A','B','A','B','C','B','A','C','B','B','C','C','B'),
"Funds"=c(5,8,9,4,6,3,5,7,6,7,6,7,6,7,6,7,4,9,5,7,5,5,5,7,9,7,6,9,4,7),
"Ratio"=c(2,2,3,1,1,2,3,3,1,3,3,3,3,1,1,3,2,1,1,1,3,1,3,3,1,2,1,3,1,3),
"WEIGHT"=c(162,65,104,118,105,49,107,93,25,24,103,115,64,186,57,123,86,181,70,111,154,135,37,73,127,148,188,169,73,52))
我有data1和data2,希望能提供一个简单的例子。
在 data1 中,您会看到 'School' 数字和 'Group' X 'Class' 组合中的 'Size'。
在 data2 中,每个 'Group' X 'Class' 组合都有关于 'Funds' 和 'Ratio' 的信息。在 data2 中,您还有 'WEIGHT' 等于抽样框,也就是说不同的“ID”具有不同的 "weight" 或重要性。
我希望创建如下所示的 data3:
总的来说,我希望 data3 有 sum(data1$Size)
行。我希望从 data1 中为每个 'School' X 'Group' X 'Class' 组合复制 'Size' 行。然后我希望通过 'Group' X 'Class' 'Funds' 和 'Ratio' 从 data2 中进行替换,使用 WEIGHTS 来告知选择每一行的概率,以填充 data3.
这里有一个带有data.table
的选项,我们根据'Size'列扩展data1,然后将两个数据集拆分为'Group'、'Class'并使用Map来根据使用 WEIGHT/sum(WEIGHT)
创建的概率在第一个数据集中创建列,以便在 sample
中用于对 'Funds'、'Ratio' 列值进行采样,分配 (:=
) 它在 list
中创建新列,最后 rbind
list elements with
rbindlist`
library(data.table)
dt1 <- setDT(data1)[rep(seq_len(nrow(data1)), Size)]
lst1 <- split(dt1, dt1[, .(Group, Class)])
lst2 <- split(data2, data2[c('Group', 'Class')], drop = TRUE)
out <- rbindlist(Map(function(x, y) {
prb = y$WEIGHT/sum(y$WEIGHT)
x[, c('Funds', 'Ratio') :=
.(sample(y$Funds, size = .N, replace = TRUE, prob=prb),
sample(y$Ratio, size = .N, replace = TRUE, prob=prb) )]},
lst1, lst2[names(lst1)]))
out[, Size := NULL]
sum(data1$Size)
#[1] 9750
nrow(out)
#[1] 9750
data1=data.frame("School"=c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5),
"Group"=c(1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2),
"Class"=c('A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C'),
"Size"=c(459,441,410,201,327,156,129,427,249,331,477,458,288,472,275,449,424,469,386,387,103,320,284,277,481,167,348,247,115,193))
data2=data.frame("ID"=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30),
"Group"=c(2,2,2,2,1,1,1,2,2,2,2,2,2,1,1,2,1,2,1,1,2,2,2,2,2,1,1,1,1,1),
"Class"=c('A','B','C','B','C','C','A','A','A','B','B','A','B','A','C','C','B','A','B','A','B','C','B','A','C','B','B','C','C','B'),
"Funds"=c(5,8,9,4,6,3,5,7,6,7,6,7,6,7,6,7,4,9,5,7,5,5,5,7,9,7,6,9,4,7),
"Ratio"=c(2,2,3,1,1,2,3,3,1,3,3,3,3,1,1,3,2,1,1,1,3,1,3,3,1,2,1,3,1,3),
"WEIGHT"=c(162,65,104,118,105,49,107,93,25,24,103,115,64,186,57,123,86,181,70,111,154,135,37,73,127,148,188,169,73,52))
我有data1和data2,希望能提供一个简单的例子。
在 data1 中,您会看到 'School' 数字和 'Group' X 'Class' 组合中的 'Size'。 在 data2 中,每个 'Group' X 'Class' 组合都有关于 'Funds' 和 'Ratio' 的信息。在 data2 中,您还有 'WEIGHT' 等于抽样框,也就是说不同的“ID”具有不同的 "weight" 或重要性。
我希望创建如下所示的 data3:
总的来说,我希望 data3 有 sum(data1$Size)
行。我希望从 data1 中为每个 'School' X 'Group' X 'Class' 组合复制 'Size' 行。然后我希望通过 'Group' X 'Class' 'Funds' 和 'Ratio' 从 data2 中进行替换,使用 WEIGHTS 来告知选择每一行的概率,以填充 data3.
这里有一个带有data.table
的选项,我们根据'Size'列扩展data1,然后将两个数据集拆分为'Group'、'Class'并使用Map来根据使用 WEIGHT/sum(WEIGHT)
创建的概率在第一个数据集中创建列,以便在 sample
中用于对 'Funds'、'Ratio' 列值进行采样,分配 (:=
) 它在 list
中创建新列,最后 rbind
list elements with
rbindlist`
library(data.table)
dt1 <- setDT(data1)[rep(seq_len(nrow(data1)), Size)]
lst1 <- split(dt1, dt1[, .(Group, Class)])
lst2 <- split(data2, data2[c('Group', 'Class')], drop = TRUE)
out <- rbindlist(Map(function(x, y) {
prb = y$WEIGHT/sum(y$WEIGHT)
x[, c('Funds', 'Ratio') :=
.(sample(y$Funds, size = .N, replace = TRUE, prob=prb),
sample(y$Ratio, size = .N, replace = TRUE, prob=prb) )]},
lst1, lst2[names(lst1)]))
out[, Size := NULL]
sum(data1$Size)
#[1] 9750
nrow(out)
#[1] 9750