gpt4 book ai didi

sas - 基于其他几个列创建半累积列。 SAS

转载 作者:行者123 更新时间:2023-12-04 14:47:12 24 4
gpt4 key购买 nike

我有一些数据,它本质上是很多列信息/数据和日期,然后是两列数字和一列是标志(即它是 1 或 0)。每行是特定月份的个人信息。
对于两列数字,我想创建两个新列,它们是每个人随时间推移的累积数字。对于标志,我希望它在该个人的所有 future 日期中都为 1,一旦该标志首次成为该个人的 1。
我正在努力表达这个(所以也谷歌我想做什么!)所以我把我拥有的和我想要的放在下面。在此示例中:A1、B1、C1 将是一个个体,而 A1、B2、C3 将是另一个个体。
我有这个:


第 1 列
Col2
第 3 列
日期
值_1
值_2
旗帜


A1
B1
C1
2021 年 1 月 1 日
0
100
0

A1
B1
C1
2021 年 2 月 1 日
0
0
0

A1
B1
C1
2021 年 3 月 1 日
10
100
0

A1
B1
C1
2021 年 4 月 1 日
50
0
0

A1
B1
C1
2021 年 5 月 1 日
0
10
1

A1
B1
C1
01Jun2021
10
0
0

A1
B1
C1
2021 年 7 月 1 日
0
0
0

A1
B2
C3
2021 年 1 月 1 日
0
0
0

A1
B2
C3
2021 年 2 月 1 日
0
20
1

A1
B2
C3
2021 年 3 月 1 日
10
20
0

A1
B2
C3
2021 年 4 月 1 日
40
20
0

A1
B2
C3
2021 年 5 月 1 日
0
0
0

A1
B2
C3
01Jun2021
30
0
0

A1
B2
C3
2021 年 7 月 1 日
0
0
0


我想要这个:


第 1 列
Col2
第 3 列
日期
Value_1_full
Value_2_full
旗帜


A1
B1
C1
2021 年 1 月 1 日
0
100
0

A1
B1
C1
2021 年 2 月 1 日
0
100
0

A1
B1
C1
2021 年 3 月 1 日
10
200
0

A1
B1
C1
2021 年 4 月 1 日
60
200
0

A1
B1
C1
2021 年 5 月 1 日
60
210
1

A1
B1
C1
01Jun2021
70
210
1

A1
B1
C1
2021 年 7 月 1 日
70
210
1

A1
B2
C3
2021 年 1 月 1 日
0
0
0

A1
B2
C3
2021 年 2 月 1 日
0
20
1

A1
B2
C3
2021 年 3 月 1 日
10
40
1

A1
B2
C3
2021 年 4 月 1 日
50
60
1

A1
B2
C3
2021 年 5 月 1 日
50
60
1

A1
B2
C3
01Jun2021
80
60
1

A1
B2
C3
2021 年 7 月 1 日
80
60
1


如果我拥有的唯一数据是一个人的数据,我可以这样做,但是有很多数据。我写的代码只是给了我列的总累积量 - 我无法弄清楚如何为每个人分别计算它们。出于类似的原因,我也在努力为标志列编写代码。我已经把代码放在下面,非常感谢任何帮助/建议。
注意:我对 SAS 真的很陌生,为了写这个问题,我一直在努力通过输入此示例的数据来正确输入日期字段(我使用了下面代码的“忽略”位作为解决方法将其放入 SAS)所以如果您能告诉我我在这里做错了什么,那也将不胜感激!

data data_1;
input Col1 $ Col2 $ Col3 $ Date date8. Ignore Value_1 Value_2 Flag;
format Date date8.;
datalines;
A1 B1 C1 "'01Jan2021'd" 0 100 0
A1 B1 C1 "'01Feb2021'd" 0 0 0
A1 B1 C1 "'01Mar2021'd" 10 100 0
A1 B1 C1 "'01Apr2021'd" 50 0 0
A1 B1 C1 "'01May2021'd" 0 10 1
A1 B1 C1 "'01Jun2021'd" 10 0 0
A1 B1 C1 "'01Jul2021'd" 0 0 0
A1 B2 C3 "'01Jan2021'd" 0 0 0
A1 B2 C3 "'01Feb2021'd" 0 20 1
A1 B2 C3 "'01Mar2021'd" 10 20 0
A1 B2 C3 "'01Apr2021'd" 40 20 0
A1 B2 C3 "'01May2021'd" 0 0 0
A1 B2 C3 "'01Jun2021'd" 30 0 0
A1 B2 C3 "'01Jul2021'd" 0 0 0
;
run;

Data data_2;
set data_1;
drop Ignore;
run;


proc sort data=data_2
out=data_3;
by Col1 Col2 Col3 Date;
run;


data data_4;
set data_3;
by Col1 Col2 Col3 Date;

retain Col1 Col2 Col3 Date Value_1 Value_2 Flag Value_1_full Value_2_full;

if first.Col1 AND first.Col2 AND first.Col3 AND first.Date then Value_1_full = Value_1;
else Value_1_full = Value_1_full + Value_1;
run;

最佳答案

所以你很接近!我认为这到达那里......

proc sort data=data_1(drop=ignore)
out=data_3;
by Col1 Col2 Col3 Date;
run;


data data_4;
set data_3;
by Col1 Col2 Col3 Date;

retain Col1 Col2 Col3 Date Value_1 Value_2 Flag Value_1_full Value_2_full;

if first.Col3 then Value_1_full = Value_1;
else Value_1_full = Value_1_full + Value_1;


if first.col3 then flag=0;
flag = max(flag,flag_Early);

run;
只有一些小的变化。我删除了一个无意义的数据步骤( drop 可以在您使用数据的任何其他地方完成)并更改 if first.成为 if first.col3 .
你不需要 col2col1 - first.col3是你关心的,另外两个变化也会引起 first.col3默认情况下也是如此。
你也不想要 First.date那里 - first.date每次更改日期(或在 by 之前的任何其他变量)时都是真的,而且每一行都会发生这种情况,所以它总是真的!你不想那样。
最后,对于 flag您需要创建一个新变量。旧变量实际上总是被保留!但它们也会在每次迭代中被新值替换。所以我们将它重命名为 flag_early或任何你喜欢的,并使用 max函数将 1 分配给 flag任何时候 flag_early 有 1 或保留 1 标志,如果它从之前有它 - 每次再次重置它 first.col3是真的。

关于sas - 基于其他几个列创建半累积列。 SAS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69812474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com