You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在无输入数据的情况下使用SAS生成测试数据?

嘿,这个问题我太熟悉了!平时做SAS开发或者验证逻辑的时候,经常需要在没有原始输入数据的情况下生成测试数据,这里给你分享几个实用且常用的方法,覆盖不同场景:

1. 用DATA步直接生成基础随机数据集

这是最灵活的方式,通过循环控制行数,搭配随机函数生成各类字段:

/* 生成100条包含ID、性别、年龄、分数的基础测试数据 */
data basic_test;
  do id = 1 to 100; /* 循环生成100条观测 */
    /* 随机生成性别:0代表女,1代表男,50%概率 */
    gender = rand('BERNOULLI', 0.5);
    /* 生成18-65岁之间的随机整数年龄 */
    age = rand('INTEGER', 18, 65);
    /* 生成均值70、标准差10的正态分布分数,取整 */
    score = round(rand('NORMAL', 70, 10), 1);
    /* 必须加output,否则只会输出最后一条循环结果 */
    output;
  end;
run;

/* 打印前5条看看效果 */
proc print data=basic_test(obs=5);
run;

小提示:rand()函数支持超多分布类型,比如UNIFORM(均匀分布)、POISSON(泊松分布),能满足大部分模拟需求。

2. 模拟贴近业务的结构化测试数据

如果需要生成类似订单、用户这类带业务属性的数据,可以结合分类选择函数和日期处理:

/* 模拟200条电商订单测试数据 */
data order_sim;
  length order_id $12 category $20 pay_status $10;
  do i = 1 to 200;
    /* 生成格式为ORD+8位数字的订单号 */
    order_id = cats('ORD', put(rand('INTEGER', 10000000, 99999999), z8.));
    /* 生成近60天内的随机订单日期 */
    order_date = today() - rand('INTEGER', 0, 59);
    /* 从预设分类里随机选商品类别 */
    category = choosec(rand('INTEGER', 1, 4), '电子产品', '服饰鞋帽', '家居用品', '食品生鲜');
    /* 生成10-1000元之间的订单金额,保留两位小数 */
    amount = round(rand('UNIFORM') * 990 + 10, 0.01);
    /* 按概率分配支付状态:80%成功,15%待支付,5%失败 */
    pay_status = choosec(rand('TABLE', 0.8, 0.15), '成功', '待支付', '失败');
    output;
  end;
  drop i; /* 删掉没用的循环变量 */
run;

/* 验证分类变量的分布是否符合预期 */
proc freq data=order_sim;
  tables category pay_status;
run;

3. 用PROC SQL快速生成测试数据

如果习惯用SQL语法,也可以用PROC SQL来生成,适合快速构建小数据集:

/* 用PROC SQL生成50条用户数据 */
proc sql;
  create table sql_test as
  select
    monotonic() as user_id label '用户ID', /* 生成自增ID */
    rand('BERNOULLI', 0.35) as is_vip label '是否VIP(0=否,1=是)',
    round(rand('NORMAL', 6000, 1500), 1) as monthly_spend label '月消费' format=comma10.,
    /* 生成近5年内的随机注册日期 */
    today() - floor(rand('UNIFORM')*365*5) as register_date label '注册日期' format=date9.
  from sashelp.class /* 用系统自带的表做基础,通过交叉连接扩展行数 */
  cross join sashelp.class
  where calculated user_id <= 50; /* 只取前50条 */
quit;

4. 生成规则化的时间序列数据

如果需要测试时间相关的逻辑,比如月度报表,可以用日期循环生成规则序列:

/* 生成2023-2024年的月度销售目标&实际数据 */
data monthly_sales;
  do report_month = '01JAN2023'd to '01DEC2024'd by month;
    region = choosec(rand('INTEGER',1,3), '华北', '华东', '华南');
    sales_target = 80000 + rand('INTEGER', 10000, 30000);
    /* 实际销售额在目标的80%-120%之间 */
    actual_sales = sales_target * rand('UNIFORM', 0.8, 1.2);
    output;
  end;
  format report_month date9. sales_target actual_sales comma12.;
run;

内容的提问来源于stack exchange,提问作者lidia mahapatra

火山引擎 最新活动