【问题标题】:Simple SAS calculation简单的 SAS 计算
【发布时间】:2013-09-11 12:25:53
【问题描述】:

我有一个包含三列的数据集:名称、ColA 和 ColB。 每个名称都有许多行,对于每个名称,我需要从 A 中减去 B,并创建一个新列来获取 A 和 B 之间差异的剩余值:

Names  ColA    ColB   NewColA
  x      100       5      95
  x      100      20      75
  x      100      10      65 

这可能吗?我尝试过使用 IF-Then 语句、Do-While 并认为是宏,但我的头脑仍然停留在 Excel/VBA 模式,所以我不知道该怎么做?

【问题讨论】:

    标签: sas datastep


    【解决方案1】:

    您的问题与通过分组进行汇总非常相似。 在这里可以找到一个例子:http://support.sas.com/kb/24/649.html

    秘诀在于使用“第一个”隐式变量。

    data out;
        set [replace with your input dataset]; 
        by names;
        retain newColA;
        if first.names then newcola=cola;
        newcola = newcola - colb;
    run;
    

    [编辑] 我忘记了保留声明。 这是一个使用来自 sashelp 的 fish 数据集的示例。 (虽然在那里这样做没有意义。)

    首先,必须对数据集进行排序。如果您的已经是,您可以直接进入数据步骤。

    proc sort data = sashelp.fish(where=(Weight ne .) drop=Length1-Length3) out = fish nodupkey force;
        by species weight height;
    run;
    
    data out;
        set fish;
        by species;
        retain newColA;
        if first.species then newColA  = weight;
        newColA = newColA - height;
    run;
    

    【讨论】:

    • “第一种”方法的问题在于它将我的数据组合在一起。我需要将所有行保留在我的数据集中,只需添加一列进行计算。
    • 在上面添加retain NewColA;
    • @user2754574。 “第一个”不会对数据进行分组。我发布的链接通过额外的“if”检查“last”来输出。这就是他对数据进行分组的方式,而不是输出所有行。
    • 它不断减去第一个 obs。每行的值,而不是转移到 2. 和 3. 值。每次它只是减去 5,而不是列的下一个值
    • 我测试了使用您自己的数据集发布的确切代码,它工作得很好。您确定将正确的变量放在保留语句中吗?应该是retain newColA;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2022-01-17
    • 2015-04-04
    • 2011-02-13
    相关资源
    最近更新 更多