【问题标题】:SAS: Combining two data sets with different formatSAS:结合两个不同格式的数据集
【发布时间】:2013-09-17 19:42:45
【问题描述】:

我有两个格式不同的数据集

data1 看起来像:

data1:

YYMM  test1
1101  98
1102  98
1103  94
1104  92
1105  99
1106  91

data 2 只是一个大均值,看起来像:

data2:

GM
95

我想将两者结合起来,得到如下所示的东西:

WANT:

YYMM  test1  GM
1101  98     95
1102  98     95
1103  94     95
1104  92     95
1105  99     95
1106  91     95

我确信有不同的方法来配置它,但我认为我应该将 95 放入一列并与 data1 合并。

我必须使用宏来完成这个简单的任务吗?请给我一些光!

【问题讨论】:

  • 你是如何创造平均数的?你可以这样做并避免创建一个小数据集和合并的一种方法是将平均值放入一个宏变量(在本例中称为平均值),然后简单地执行:data data3;设置数据1; GM = &mean.;跑; -- 除此之外你可以只做 data data3;合并数据1数据2;跑;它应该可以工作
  • 我不认为这是正确的@scott,关于你的最后一个建议。 SAS 仅在您使用副语句时保留最后一条记录。 (在这种情况下,每个分组的最后一条记录)

标签: merge sas dataset


【解决方案1】:

一种直接的方法是只合并而不使用 by 语句和使用保留:​​

data WANT (drop=temp);
    merge DATA1 DATA2 (rename=(GM=temp));
    retain GM;
    if _N_=1 then GM=temp;
run;

所以基本上你把两个数据集放在一起。 因为没有by-statement,它将连接两个数据集的第一条记录,两个数据集的第二条记录等等。

在第一个记录中(如果 N=1),您获取平均值并将其放入将记住最后一个值的变量中(保留 GM)。 因此,在记录 2、3 等中,值仍然是您在记录 1 中放入的值。

为了保持干净,我在输入中重命名了您的 GM 变量,因此它可以用作保留变量的名称。当然,我删除了冗余变量。

您也可以使用宏变量或 proc sql 来解决此问题。但最好保持简单。

【讨论】:

  • 成功了。哇。那很简单。非常感谢您的意见!
  • N 来自哪里?它是隐藏变量之一吗?还有,为什么是1?
  • _N_ 是一个内部值,等于数据步骤执行的迭代次数。在一个简单的“集合”上“通常”,这等于行号。
【解决方案2】:

这是一个稍微简单的类似方法。

data want;
set data1;
if _n_=1 then set data2;
run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多