【问题标题】:Merging cells within the same table in SAS or Proc Sql在 SAS 或 Proc Sql 中合并同一表中的单元格
【发布时间】:2015-02-25 16:47:13
【问题描述】:

我有一个表,其中包含一个客户列,后跟多个列(与商店有关)和一个标志,表明他们是否访问过这家商店,如果没有,则单元格为空。商店按重要性顺序列出,Shop1 最高,shop2、shop3 等等。表示客户是否访问过该特定商店的标志是与商店编号相关的数字。因此,例如,如果客户没有访问过 shop1,则此单元格将为空白,但如果他们访问过 shop2,则此单元格将为“2”。

我需要将这些列合并在一起,为每个客户创建一个表,其中包含他们访问过的前 4 家商店,例如,客户的条目可以读取第一列“2”,第二列“5”,第三列“7”,第四列“8”,因为他们没有去过1、3、4或6号商店。有人可以帮忙吗?谢谢。

【问题讨论】:

  • 如果您向我们展示您的数据示例以及您的期望和尝试过会更好

标签: sql merge null sas


【解决方案1】:

我认为这就是您要寻找的。获取输入数据(我假设您的意思),执行转置,过滤缺失的(空)值,然后再次转置。

data input;
input customer $ shop01 shop02 shop03 shop04;
datalines;
Bill 1 2 . .
Ted  . 2 3 .
;

proc sort data=input;
by customer;
run;

proc transpose data=input out=temp(where=(col1 ^= .) drop=_name_);
by customer;
run;

proc transpose data=temp out=output(drop=_name_);
by customer;
run;

这给了我:

Bill 1 2
Ted  2 3

【讨论】:

    【解决方案2】:

    鉴于您的数据是如何布局的,您可以使用带有变量列表的 smallest 函数来返回商店变量中第一个最小的非缺失值、第二个最小的值,依此类推。

    data test(drop=shop01-shop08);
      set input;
      first  = smallest(1,of shop01-shop08);
      second = smallest(2,of shop01-shop08);
      third  = smallest(3,of shop01-shop08);
      fourth = smallest(4,of shop01-shop08);
    run;
    

    【讨论】:

    • 谢谢!这真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    相关资源
    最近更新 更多