如何对数据集的行进行求和?

时间:2016-11-14 16:23:25

标签: sas

我想要数据集的行总和。特别是,我想从第二个元素到最后一个元素求和(跳过第一个条目)。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

听起来你想要添加除第一列之外的所有内容。你也不知道你有多少变量,而且随着时间的推移会有很多变化。

可能有更聪明的方法,但这里有3个选项。

如果您的ID值存储为文本而其他所有内容都是数字,那么可以说:

data sum;
  set test;
  sum =  sum(of _numeric_);
run;

将简单地添加所有数字变量。但是听起来你有整数ID,所以这些选项中的一个可能会起作用。首先,一些样本数据:

data test;
  input id var1 var2 var3;
cards;
1 2 2 2
2 3 3 3
3 4 4 4
4 5 5 5
;
run;

选项1 - 只需将所有数字变量相加,然后减去您的ID值,这将为您提供除ID之外的所有内容的总和:

data test2;
  set test;
  sum=sum(of _numeric_)-id;
run;

选项2 - 您可以告诉SAS按照数据集中列出的顺序对一系列变量进行操作。你可以做sum = sum(var1--var3);,但是你可能不知道第一个和最后一个变量是什么。还有可能你的ID变量位于某个中间位置。

解决这个问题的方法是确保你的ID变量是第一个,然后在你想要求和的变量范围之前和之后创建虚拟变量:

data test3;
  format id START_SUM;
  set test;
  END_SUM = .;
  sum = sum(of START_SUM--END_SUM);
  drop START_SUM END_SUM;
run;

在设置数据之前创建ID和START_SUM,然后在数据末尾创建空END_SUM。然后它将从START_SUM到END_SUM的所有内容相加,并且由于sum(of ...)跳过了缺失值,因此您只能获得实际关注的变量的总和。然后删除虚拟变量,因为它们不再是必需的。

选项1显然更简单,但选项2有一些潜在的好处,因为它适用于数字和非数字ID,并且当您添加和减去ID时,没有机会受到任何类型的奇怪舍入问题的影响(虽然如果一切都是整数,那就不会发生。)