【问题标题】:How to align data that are on a diagonal in SAS如何对齐 SAS 中对角线上的数据
【发布时间】:2020-11-23 02:23:54
【问题描述】:

我不确定描述这个问题的最佳方式,我承认我编写的以更小格式重新创建问题的代码不太准确。

我有 7 个数据集,它们的列数相同 (122),但行数不同。除了下划线和整数之外,这些列的标签是相同的。示例:每个数据集的第一列是 "study_id_1" "study_id_2" ... "study_id_7"

我正在尝试将这些数据集按数字顺序堆叠在一起,并删除下划线和整数。

但是,如果我使用这段代码,所有的值都在块中,但沿对角线。

data all;
set PT_BS1_all PT_BS2_all PT_BS3_all PT_BS4_all PT_BS5_all PT_BS6_all PT_BS7_all;
run;

以下代码(用 SAS Studio 编写)几乎可以说明问题和“对角线”。但是,在我的实际数据中(在 SAS EG 中工作),所有缺失值都是句点,无论变量类型如何。在下面的示例中,我只能为数值变量的缺失值显示句点。

data have;
input study_id_1 $ variable1_1 $ variable2_1 variable3_1 study_id_2 $ variable1_2 $ variable2_2 variable3_2 study_id_3 $ variable1_3 $ variable2_3 variable3_3;
cards;
A treatment 35 24 . . . . . . . .
B placebo 24 44 . . . . . . . .
C treatment 66 77 . . . . . . . .
D placebo 73 45 . . . . . . . .
. . . . A treatment 23 34 . . . .
. . . . B placebo 43 56 . . . .
. . . . C treatment 34 34 . . . .
. . . . D placebo 54 67 . . . .
. . . . . . . . A treatment 22 66
. . . . . . . . B placebo 33 67
. . . . . . . . C treatment 23 48
. . . . . . . . D placebo 69 70
;
run;

proc print data=have;
run;

data want;
input study_id $ variable1 $ variable2 variable3;
cards;
A treatment 35 24
B placebo 24 44
C treatment 66 77
D placebo 73 45
A treatment 23 34
B placebo 43 56
C treatment 34 34
D placebo 54 67
A treatment 22 66
B placebo 33 67
C treatment 23 48
D placebo 69 70
;
run;

proc print data=want;
run;

我希望我已经充分描述了这个问题,并感谢您的帮助。

【问题讨论】:

  • 附加到变量的标签无关紧要。你的意思是名字有数字后缀吗?

标签: sas


【解决方案1】:

COALESCECOALESCEC 函数返回值列表中第一个非缺失值。

变量列表在您的数据集中非常简单,因为相似的变量具有共同的前缀(和 1、2、3 后缀)。指定相似变量的语法是<prefix>:

例子:

data want;
  set have;

* coalesce during stacking;
* set PT_BS1_all PT_BS2_all PT_BS3_all PT_BS4_all PT_BS5_all PT_BS6_all PT_BS7_all;

  length study_id $8 variable1 $9;

  study_id  = coalesceC(of study_id_:);
  variable1 = coalesceC(of variable1_:);
  variable2 = coalesce (of variable2_:);
  variable3 = coalesce (of variable3_:);

  drop study_id_: variable1_: variable2_: variable3_:;
run;

【讨论】:

    【解决方案2】:

    与其清理由于列名未对齐而对角线的已编译数据集输出,不如通过适当地重命名列来调整输入。具体来说,使用从proc sql 构建的oldname=newname 模式的动态宏删除带有scan 的下划线后缀。然后将此宏传递给后续的rename 命令。

    以下假设所有数据集都位于WORK 库中。相应地调整 SQL WHERE

    %macro rename_cols(dset);
       proc sql noprint;
          select cats(name,'=',scan(name, 1, '_'))
          into :suffix_clean separated by ' '
          from dictionary.columns
          where libname = 'WORK' and memname = "&dset.";
       quit;
    
       data &dset;
          set &dset;
          rename &suffix_clean;
       run;
    %mend rename_cols;
    
    %rename_cols(PT_BS1_ALL);
    %rename_cols(PT_BS2_ALL);
    %rename_cols(PT_BS3_ALL);
    %rename_cols(PT_BS4_ALL);
    %rename_cols(PT_BS5_ALL);
    %rename_cols(PT_BS6_ALL);
    %rename_cols(PT_BS7_ALL);
    
    
    data all; 
       set PT_BS1_all
           PT_BS2_all
           PT_BS3_all
           PT_BS4_all
           PT_BS5_all
           PT_BS6_all
           PT_BS7_all; 
    run;
    

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2021-09-17
      • 1970-01-01
      相关资源
      最近更新 更多