假设我有以下数据框:
sectoral_data <- data.frame(sector=c("a","b","c","d"),share=c(0.5,0.3,0.1,0.1),avg_wage=c(400,600,800,1000))
其中“份额”是每个部门的就业份额。我想模拟(我想这是正确的词)下面的数据框,该数据框代表来自该经济体的十个人的样本:
personal_data <- data.frame(individual=c(1:10),
wage=c(rep.int(400,5),rep.int(600,3),rep.int(800,1), rep.int(1000,1)),
sector=c(rep("a",5),rep("b",3), rep("c",1), rep("d",1))
)
关于有效方法和/或是否有内置功能的任何想法?
您可以使用sample
:
n <- 10
with(sectoral_data,
data.frame(
individual = seq_len(n),
wage = sample(avg_wage, size = n, replace = TRUE, prob = share),
sector = sample(sector, size = n, replace = TRUE, prob = share)
))
# individual wage sector
#1 1 400 c
#2 2 600 c
#3 3 800 a
#4 4 800 b
#5 5 400 b
#6 6 400 a
#7 7 400 b
#8 8 600 c
#9 9 400 a
#10 10 400 c
R具有许多用于模拟随机事件的功能。在这种特殊情况下,我认为多项式随机向量可能会有用。
这里是一个例子。我们说我们要拿10个人,而这些个人分为4类,具有不同的概率:
inds <- rmultinom(10, 1, sectoral_data$share)
inds
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 1 1 0 0 0 1 0 0 1
[2,] 0 0 0 0 1 0 0 0 1 0
[3,] 0 0 0 0 0 0 0 0 0 0
[4,] 0 0 0 1 0 1 0 1 0 0
结果是一个矩阵,在每一列中它指示选择了哪个人。为了将其转换为实际索引(从1到4),我们在每一列上调用which.max()
:
inds <- apply(inds, 2, which.max)
inds
[1] 1 1 1 4 2 4 1 4 2 1
现在我们可以使用此向量从原始数据中选择个人:
data.frame(individual=1:10, sectoral_data[inds, c("sector", "avg_wage")])
individual sector avg_wage
1 1 a 400
1.1 2 a 400
1.2 3 a 400
4 4 d 1000
2 5 b 600
4.1 6 d 1000
1.3 7 a 400
4.2 8 d 1000
2.1 9 b 600
1.4 10 a 400
这是一种实现方法,但是看起来非常简单直接。