我想进行蒙特卡洛模拟。我有一个data.frame
,其中行是唯一的ID,具有与列之一关联的可能性。可以将输入列中的数据视为该概率的权重。我想根据每一行列出的权重随机sample
中的每一行data.frame
。每行每次运行应仅返回一个值。 data.frame
结构如下:
ID, X2000, X2001, X2002, X2003, X2004
X11, 0, 0, 0.5, 0.5, 0
X33, 0.25, 0.25, 0.25, 0.25, 0
X55, 0, 0, 0, 0, 1
X77, 0.5, 0, 0, 0, 0.5
对于权重,“ X11”应返回X2002或X2003,“ X33”应具有相等的返回X2000,X2001,X2002或X2003的概率,并且应该相等,而没有返回X2004的机会。 “ X55”的唯一可能的返回值应该是X2004。
我感兴趣的输出数据是该运行所采样的ID和列,尽管返回如下所示的内容可能更简单:
ID, X2000, X2001, X2002, X2003, X2004
X11, 0, 0, 1, 0, 0
X33, 1, 0, 0, 0, 0
X55, 0, 0, 0, 0, 1
X77, 1, 0, 0, 0, 0
答案 0 :(得分:1)
您的data.frame已转置-sample()
函数采用概率向量。但是,您的概率向量是按行排列的,这意味着要从data.frame中提取数据更加困难。
要解决此问题-您可以将ID列作为row.name导入。这使您能够在apply()
语句期间访问它。请注意,apply()
会将data.frame强制转换为矩阵,这意味着仅允许一种数据类型。这就是为什么ID必须是行名的原因-否则我们将使用字符而不是数字的概率矢量。
mc_df <- read.table(
text =
'ID X2000 X2001 X2002 X2003 X2004
X11 0 0 0.5 0.5 0
X33 0.25 0.25 0.25 0.25 0
X55 0 0 0 0 1
X77 0.5 0 0 0 0.5'
, header = T
,row.names = 1)
从那里可以使用apply函数:
apply(mc_df, 1, function(x) sample(names(x), size = 200, replace = T, prob = x))
或者您也可以幻想
apply(mc_df, 1, function(x) table(sample(names(x), size = 200, replace = T, prob = x)))
$X11
X2002 X2003
102 98
$X33
X2000 X2001 X2002 X2003
54 47 64 35
$X55
X2004
200
$X77
X2000 X2004
103 97
Fancier:
apply(mc_df, 1, function(x) table(sample(as.factor(names(x)), size = 200, replace = T, prob = x)))
X11 X33 X55 X77
X2000 0 51 0 99
X2001 0 50 0 0
X2002 91 57 0 0
X2003 109 42 0 0
X2004 0 0 200 101
或更奇特的
prop.table(apply(mc_df
, 1
, function(x) table(sample(as.factor(names(x)), size = 200, replace = T, prob = x)))
,2)
X11 X33 X55 X77
X2000 0.00 0.270 0 0.515
X2001 0.00 0.235 0 0.000
X2002 0.51 0.320 0 0.000
X2003 0.49 0.175 0 0.000
X2004 0.00 0.000 1 0.485