我想解决以下问题: 我只想创建一个大列(比方说Dimension 20000)。 在本专栏中,我想根据概率重现字母“ A”-“ I”。 例如,如果出现“ A”的概率为9%,则在这20000个观测值中恰好有9%在此列中将具有“ A”。 如果“ E”的出现是20%,则此列的20%应该用“ E”填充,依此类推...
关于我为什么没有示例代码,我是SAS的新手。 我已经为这些字母创建了频率表,因此可以使用它来生成我的专栏。
我将非常感谢您的帮助! 谢谢!
答案 0 :(得分:3)
想要使用RAND()
函数和TABLE分布生成一系列随机数的声音。然后,您可以使用生成的数字来选择哪个字母。
data test;
do sample=1 to 10 ;
int=rand('table',0.1,0.2,0.3,0.1,0.3);
char=byte(rank('A')-1+int);
output;
end;
run;
答案 1 :(得分:1)
如果列中的字母顺序无关紧要
data have;
input symbol $1. prob;
datalines4;
A 0.1
B 0.2
C 0.3
D 0.4
;;;;
run;
%let length_of_column=100;
data want(keep=column);
length column $&length_of_column. c $&length_of_column.;
set have nobs=nobs;
retain c;
do j=1 to prob*&length_of_column;
column=strip(symbol) || strip(c);
c=column;
end;
if _n_ =nobs then output;
run;
因此,输入为:
+--------+------+
| symbol | prob |
+--------+------+
| A | 0.1 |
+--------+------+
| B | 0.2 |
+--------+------+
| C | 0.3 |
+--------+------+
| D | 0.4 |
+--------+------+
prob变量的总和必须等于1。宏变量length_of_column
必须小于或等于32767(根据sas限制)。
输出(长度= 100):
+------------------------------------------------------------------------------------------------------+
| c |
+------------------------------------------------------------------------------------------------------+
| DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBBBBBAAAAAAAAAA |
+------------------------------------------------------------------------------------------------------+
如果您想在一行中存储一个字母之类的字母,则可以使用以下解决方案(不限字数):
%let length_of_column=10;
data want(keep=column);
length column $&length_of_column.;
set have;
do j=1 to prob*&length_of_column;
column=strip(symbol);
output;
end;
run;
输出(输入相同,长度= 10):
+--------+
| column |
+--------+
| A |
+--------+
| B |
+--------+
| B |
+--------+
| C |
+--------+
| C |
+--------+
| C |
+--------+
| D |
+--------+
| D |
+--------+
| D |
+--------+
| D |
+--------+
答案 2 :(得分:0)
如果您希望精确地 而不是随机选择,那么给定输入数据集,这是微不足道的。
data probs;
input char $ prob;
datalines;
A .2
B .3
C .25
D .1
E .1
F .05
;;;;
run;
%let dataset_size=20000;
data want;
set probs;
do _n_ = 1 to floor(&dataset_size. * prob);
output;
end;
run;
仅遍历百分比数据集。这里“概率”没有正确使用,实际上是“百分比”。
例如,通常可以这样做来创建一个初始数据集以进行子采样(您可以使用proc surveyselect
生成子采样)。