【问题标题】:Choosing the mode of a string by group in SAS在SAS中按组选择字符串的模式
【发布时间】:2020-11-01 10:30:49
【问题描述】:

这似乎是一个非常简单的操作,但我找不到一个简单的方法来做到这一点。我有一个数据集,其中包含每次购买的客户 ID 和星期几。我只想通过id获得weekday的模态值

DATA have;
 INPUT id weekday $;
CARDS;
1 Thursday
1 Monday
1 Monday
2 Tuesday
2 Thursday
2 Tuesday
;
RUN; 

DATA want;
 INPUT id weekday $;
CARDS;
1 Monday
2 Tuesday
;
RUN; 

【问题讨论】:

    标签: sas


    【解决方案1】:

    嗯,一种方法可能是:

    1. 首先通过id和weekdays本身计算工作日数;
    2. 然后通过id只获取count变量的max()。

    当然,如果您有一个多模式组,这将通过 id 为您提供与其具有的模式数量一样多的行:

    proc sql;
    create table want as
    select distinct
    *
    from (select
        *,
        count(weekday) as N
        from have
        group by id, weekday)
    group by id
    having N=max(N);
    quit;
    

    【讨论】:

      【解决方案2】:

      您可以使用Proc FREQ 统计BY 组分区中的项目数,并使用DATA Step 过滤掉mode 值。

      例子:

      proc freq data=have noprint order=freq;
        by id;
        table weekday / out=counts;
      run;
      
      data want;
        set counts;
        by id;
      
        * output multiple rows if there is a frequency count tie;
      
        if first.id then _mode_count = count;
        if _mode_count = count;
      
        retain _mode_count;
        keep id weekday;
      run;
      

      【讨论】:

      • 成功了,谢谢!让我看看: 序列:在 proc freq 中,您按频率排序,也称为计数。然后在数据步骤中创建一个名为 mode 的新变量,仅当它是 id 的第一行时才获取值(计数)。然后仅在 mode=count 时保留,删除其他行。对吗?
      • order=freq 告诉程序以递减的计数顺序输出表变量值和计数(最高频率在前,因此模式在前)。 out=counts 命名输出数据集。输出数据包含by 组的列(又名变量)、tabled 变量和count 中的组内计算频率计数和percent 中的百分比。 worker 变量维护组中第一行的计数,这是频率选项和语句编码的设计模式。 if _mode=count;` 是一个子集,如果,实际上是,删除其他行。
      • 另外,仅供参考,Proc UNIVARIATE 也计算模式(仅适用于数字变量),当频率计数存在关联时,会选择最小值作为模式。
      • 非常感谢您提供的所有详细说明!
      猜你喜欢
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 2021-10-03
      • 2015-02-21
      相关资源
      最近更新 更多