如何根据列的总和划分所有观察值
How to divide all the observations based on a sum of a column
我正在尝试进行简单的计算,但我是新手,SAS 对我来说并不直观。
假设我有这个 table。
data money;
infile datalines delimiter=",";
input name $ return $ invested;
datalines;
Joe,10,100
Bob,7,50
Mary,80,1000
;
创建这个
/* name | return | invested */
/* _________________________ */
/* Joe | 10 | 100 */
/* Bob | 7 | 50 */
/* Mary | 80 | 50 */
我想为刚转到 SAS 的工作做三件事。
我需要确保 return
和 invested
列是数字。当我 运行 上面的代码时, return
列最终成为一个 CHAR 列,我不知道为什么。
现在我想创建一个新列并计算他们每个人得到的总数 return 的份额。在这种情况下,return
=97 的总和。这就是我想要的结果。
/* name | return | invested | share_of_return */
/* ____________________________________________ */
/* Joe | 10 | 100 | 10.30% */
/* Bob | 7 | 50 | 7.22% */
/* Mary | 80 | 50 | 82.47% */
- 接下来我想找到他们的投资回报率。即(return-investment) / investment * 100。这就是我要找的结果
/* Find ROI */
/* name | return | invested | share_of_return | ROI */
/* ___________________________________________________ */
/* Joe | 10 | 100 | 10.30% | -90% */
/* Bob | 7 | 50 | 7.22% | -86% */
/* Mary | 80 | 50 | 82.47% | 60% */
非常感谢您提前的解释和指导。这是一个工作项目,我们刚刚切换到 SAS
1 和 3 很容易,2 稍微难一些。
- 删除 INPUT 语句中的 $。 $ 表示字符。在您的数据中,您可能需要使用输入函数来转换它。
修复例如:
input name $ return invested;
使用输入函数修复实际数据。请注意,您不能将数据步骤中的类型转换为相同的名称,因此我在使用重命名数据集选项读取它时重命名它。
data money2;
set money (rename = return = return_char);
return = input(return_char, best.);
drop return_char;
run;
- 将总值添加到数据步骤,SQL 此处最快:
proc sql;
create table money3 as
select *, sum(return) as return_total, return/calculated return_total as return_percentage f=percent12.1
from money2;
quit;
我概述了执行此操作的两种不同方法here
- 在一个数据步骤中,添加您的计算。如果可以在第一步完成,它可能是最有效的。
由于数据步骤会自动循环,因此您编写的公式与所示的差不多。在这种情况下,我还应用了一种格式,因此它显示为百分比,但这要求您不要将它乘以 100。根据您接下来要执行的操作,最好将其保留为数字。
data money2;
set money (rename = return = return_char);
return = input(return_char, best.);
ROI = (return - investment)/investment;
format ROI percent12.1;
run;
drop return_char;
run;
我正在尝试进行简单的计算,但我是新手,SAS 对我来说并不直观。
假设我有这个 table。
data money;
infile datalines delimiter=",";
input name $ return $ invested;
datalines;
Joe,10,100
Bob,7,50
Mary,80,1000
;
创建这个
/* name | return | invested */
/* _________________________ */
/* Joe | 10 | 100 */
/* Bob | 7 | 50 */
/* Mary | 80 | 50 */
我想为刚转到 SAS 的工作做三件事。
我需要确保
return
和invested
列是数字。当我 运行 上面的代码时,return
列最终成为一个 CHAR 列,我不知道为什么。现在我想创建一个新列并计算他们每个人得到的总数 return 的份额。在这种情况下,
return
=97 的总和。这就是我想要的结果。
/* name | return | invested | share_of_return */
/* ____________________________________________ */
/* Joe | 10 | 100 | 10.30% */
/* Bob | 7 | 50 | 7.22% */
/* Mary | 80 | 50 | 82.47% */
- 接下来我想找到他们的投资回报率。即(return-investment) / investment * 100。这就是我要找的结果
/* Find ROI */
/* name | return | invested | share_of_return | ROI */
/* ___________________________________________________ */
/* Joe | 10 | 100 | 10.30% | -90% */
/* Bob | 7 | 50 | 7.22% | -86% */
/* Mary | 80 | 50 | 82.47% | 60% */
非常感谢您提前的解释和指导。这是一个工作项目,我们刚刚切换到 SAS
1 和 3 很容易,2 稍微难一些。
- 删除 INPUT 语句中的 $。 $ 表示字符。在您的数据中,您可能需要使用输入函数来转换它。
修复例如:
input name $ return invested;
使用输入函数修复实际数据。请注意,您不能将数据步骤中的类型转换为相同的名称,因此我在使用重命名数据集选项读取它时重命名它。
data money2;
set money (rename = return = return_char);
return = input(return_char, best.);
drop return_char;
run;
- 将总值添加到数据步骤,SQL 此处最快:
proc sql;
create table money3 as
select *, sum(return) as return_total, return/calculated return_total as return_percentage f=percent12.1
from money2;
quit;
我概述了执行此操作的两种不同方法here
- 在一个数据步骤中,添加您的计算。如果可以在第一步完成,它可能是最有效的。 由于数据步骤会自动循环,因此您编写的公式与所示的差不多。在这种情况下,我还应用了一种格式,因此它显示为百分比,但这要求您不要将它乘以 100。根据您接下来要执行的操作,最好将其保留为数字。
data money2;
set money (rename = return = return_char);
return = input(return_char, best.);
ROI = (return - investment)/investment;
format ROI percent12.1;
run;
drop return_char;
run;