【问题标题】:Summing a table with an unknown number of variables?对具有未知数量变量的表求和?
【发布时间】:2014-06-10 21:05:49
【问题描述】:

我是 SAS 的新手。我过去用过一点,但真的很生锈。

我有一个如下所示的表格:

Key   Group1 Metric1  Group2  Metric2  Group3 Metric3
1                .       r       20             .
1                .                .        t     3

对于几个唯一的键。 我希望所有内容都出现在一行上,这样看起来像。

Key   Group1 Metric1  Group2  Metric2  Group3 Metric3
1                .       r       20       t      3

另一个问题是我不知道我会有多少组和指标列(尽管我总是有相同的数字)。

我不确定如何处理这个问题。我能够获取列名列表并在宏中使用它们,我只是不确定我需要使用什么 proc 或 datastep 函数来折叠所有内容。如果有任何建议,我将非常感激。

【问题讨论】:

    标签: sas


    【解决方案1】:

    有一个非常简单的方法可以使用一个不错的技巧来做到这一点。我之前已经回答过类似的问题,其中一个请参阅here。这应该完全符合您的要求。

    【讨论】:

      【解决方案2】:

      您可以使用 2 个临时数组(一个用于字符变量,另一个用于数字),并相应地用非空白值填充它们。当您到达last.key 时,您可以将临时数组加载回源变量中。

      如果事先知道字符变量的最大长度,可以硬编码,如果不知道,可以动态确定。

      这假设对于每个键,每个变量只填充一次。否则,它将采用它在每个键中看到的特定变量的最后一个值。

      %LET LIB = 工作; %LET DSN = 我的数据; %LET KEYVAR = 键; /* 获取列名/类型/最大长度 */ 过程 sql ; /* 数字 */ 选择名称,count(name) 到 :NVARNAMES 中,用 ' ' 分隔,:NVARNUM 来自dictionary.columns 其中 libname = upcase("&LIB") 和 memname = upcase("&DSN") 和名称 ^= upcase("&KEYVAR") 和 type = 'num' ; /* 人物 */ 选择名称、计数(名称)、最大值(长度)到 :CVARNAMES 中,以 ' '、:CVARNUM、:CVARLEN 分隔 来自dictionary.columns 其中 libname = upcase("&LIB") 和 memname = upcase("&DSN") 和名称 ^= upcase("&KEYVAR") 和类型 = 'char' ; 辞职 ; 数据扁平化; 设置 &LIB..&DSN ; 通过 &KEYVAR ; 数组 n{&NVARNUM} &NVARNAMES ; 数组 nt{&NVARNUM} _TEMPORARY_ ; 数组 c{&CVARNUM} &CVARNAMES ; 数组 ct{&CVARNUM} $&CVARLEN.. _TEMPORARY_ ; 保留 nt ct ; 如果 first.&KEYVAR 然后做 ; 调用缺失(nt{*},ct{*}); 结尾 ; /* 将非缺失数值加载到临时数组中 */ 做 i = 1 到暗淡(n); 如果没有丢失(n{i}) 则 nt{i} = n{i} ; 结尾 ; /* 将非缺失字符值加载到临时数组中 */ 做 i = 1 到暗淡(c); 如果没有丢失(c{i}) 那么 ct{i} = c{i} ; 结尾 ; 如果 last.&KEYVAR 然后做 ; /* 将数值加载回原始变量 */ 调用 missing(of n{*}) ; 做 i = 1 到暗淡(n); n{i} = nt{i} ; 结尾 ; /* 将字符加载回原始变量 */ 调用 missing(of c{*}) ; 做 i = 1 到暗淡(c); c{i} = ct{i} ; 结尾 ; 输出 ; 结尾 ; 放下我; 跑 ;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-04
        相关资源
        最近更新 更多