根据分布表为变量分配值

时间:2019-08-27 12:25:29

标签: sas

我想解决以下问题: 我只想创建一个大列(比方说Dimension 20000)。 在本专栏中,我想根据概率重现字母“ A”-“ I”。 例如,如果出现“ A”的概率为9%,则在这20000个观测值中恰好有9%在此列中将具有“ A”。 如果“ E”的出现是20%,则此列的20%应该用“ E”填充,依此类推...

关于我为什么没有示例代码,我是SAS的新手。 我已经为这些字母创建了频率表,因此可以使用它来生成我的专栏。

我将非常感谢您的帮助! 谢谢!

3 个答案:

答案 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生成子采样)。