【问题标题】:SAS looping over variable list to count unique valuesSAS遍历变量列表以计算唯一值
【发布时间】:2015-09-17 00:12:40
【问题描述】:

我不太熟悉 SAS 逻辑,也不知道我的任务应该使用哪些步骤。基本上我想计算唯一记录数和记录数之间的比率(唯一比率)以确定变量是离散的还是连续的。该数据集包含 700 多个变量和 5M 条记录,因此使用 proc freq 可能会崩溃。

这是我建议的步骤:

  1. 数据集中的样本 100000
  2. 计算样本中每一列的“唯一比率”

重复第 1 步和第 2 步 N 次,比如 50 次。我们将有最终的数据集,如:

  Var_name  Sample_Number  Unique_ratio
    Var_1       1               0.58
     ....        .....           .....

然后为每个变量计算所有 N 个样本的平均唯一比率。

我可以在 python 或 R 中轻松地做到这一点。但是将其转换为 SAS 是非常痛苦的。有哪位 SAS 专家能给我一些建议吗?

【问题讨论】:

  • 变量是数字还是字符还是混合?
  • 它是字符和数字的混合 :)
  • 这里有用的页面。 sascommunity.org/wiki/Cardinality_Ratio。我想知道您是否有足够的内存用于哈希方法?您的连续变量会有数百万个不同的值,还是可能只有数千个?

标签: sas


【解决方案1】:

使用 PROC FREQ 中的 NLEVELS 统计数据。这是一个使用混合了数字和字符变量的 SASHELP.CLASS 数据集的示例。请注意,我在未执行的 SET 语句上使用 NOBS 选项来获取观察总数。如果您的输入是一个视图,那么您可能需要以其他方式计算观察次数。

proc freq nlevels data=sashelp.class ;
  ods output nlevels=nlevels;
  tables _all_ / noprint ;
run;
data want ;
  if 0 then set sashelp.class(drop=_all_) nobs=nobs ;
  set nlevels;
  total=nobs;
  unique_ratio = nlevels/total ;
run;
proc print; run;

如果您确实有大量唯一值,那么您可能只需要在数据的随机子集上运行它。 PROC FREQ 应该能够处理 700 个变量的 10,000 个观察值,即使它们都是唯一的。

【讨论】:

  • 请注意问题声称“运行 PROC FREQ 可能会崩溃”。我对它的真实性没有特别的判断。
  • 原始帖子中使用 10,000 个观察样本的想法将奏效。即使所有 700 多个变量都是唯一的,SAS 也可以处理 700*10,000 个唯一值。
  • 我理解(并同意)- 只是认为值得在答案中提及,因为您明确反对问题提出的内容。
  • 谢谢你们!该过程适用于具有 100,000 个观测值的样本。我只需要设置一个循环来计算多个随机样本的 unique_ratio
  • @user2517984 我建议阅读 David Cassell 的“不要胡思乱想”,了解如何有效地做到这一点。
【解决方案2】:
 proc sql;
    create table need as
    select Distinct count(*) as unique_records,count(xxx)as number_of_rec
    from have;`enter code here`

    quit;

    data need1;
    set need;
    ratio=(unique_records/number_of_rec)*100;
    run;

【讨论】:

  • 请注意,不在代码中的文本不应缩进到代码块中;它应该是完整的英文单词/句子(“You”而不是“u”等);它应该解决答案。 “我不确定这是否会奏效”并不是真的有用,除非你描述你所做的假设你不确定。
  • 谢谢乔的建议。
猜你喜欢
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2012-10-05
  • 2023-01-16
  • 1970-01-01
  • 2022-01-01
  • 2021-12-01
  • 2014-11-19
相关资源
最近更新 更多