假设我有一个包含5行2列的表。 第一列用于分布类型(例如,正态,对数正态,Weibull等),第二列用于各个参数。 我想创建一个for循环,该循环将为5行中的每行创建一个新数据表,在该新数据表中,将添加一个新列,并根据该行的参数添加一个随机采样函数。
例如第1行->普通(0.1,0.02);创建一个新数据表,其列的公式为
randomnormal(0.1,0.02)
我当前的挑战是不同的分发类型需要不同数量的参数。 赞赏一些有关我应该如何处理此问题的见解。
你好
一些想法:
1)如果可能的话,我会将参数分成几列以使公式的脚本编写更容易
2)我将使用MATCH公式查找分布的名称,并专门为对应的分布调用Random函数
Match( :Distribution,
"Normal", Random Normal( :Parameter 1, :Parameter 2 ),
"LogNormal", Random Lognormal( :Parameter 1, :Parameter 2 ),
.
)
这是一个简单的示例,说明如何执行您要求的操作
Names Default To Here( 1 );
dt = New Table( "Sample",
Add Rows( 5 ),
New Column( "Types",
Character,
Set Values(
{"Normal", "Lognormal", "Weibull", "Uniform", "Johnson Su"}
),
Set Display Width( 79 )
),
New Column( "Parameters",
Character,
Set Values(
{"(0.1,0.02)", "(0.2,.005)", "(0.3,0.005)", "(0.1,0.5)",
"(0.5, 1, 1, 1)"}
),
Set Display Width( 101 )
)
);
For( i = 1, i <= N Rows( dt ), i++,
Eval(
Substitute(
Expr(
New Table( dt:Types[i],
add rows( 20 ),
New Column( "Random " || dt:Types[i],
set each value( __formula__ )
)
)
),
Expr( __formula__ ),
Parse( "Random " || dt:Types[i] || dt:Parameters[i] )
)
)
);
请花点时间充分了解脚本的工作原理,如果您不理解脚本,请回覆以便社区可以为您提供您可能需要的其他信息。
感谢Thierry,如果我想限制参数的列数,有什么建议吗?
我还有一个担心,我相信Match()公式区分大小写。 我可以尝试通过在列上放置一个列表检查来控制它。 还有其他控制/管理方式吗?