楼主: littlesas
1929 6

[问答] 寻求高手技术支持!如何根据一个SAS数据集的观测值,对另一个SAS数据集进行子集操作! [推广有奖]

  • 1关注
  • 3粉丝

已卖:109份资源

硕士生

38%

还不是VIP/贵宾

-

威望
0
论坛币
410 个
通用积分
29.3168
学术水平
12 点
热心指数
9 点
信用等级
8 点
经验
1441 点
帖子
107
精华
0
在线时间
157 小时
注册时间
2008-11-15
最后登录
2025-3-22

楼主
littlesas 发表于 2017-11-11 11:18:43 |AI写论文
5论坛币
各位看官,本人遇到一个SAS编程问题,百思不得其解,请教一下:

现有两个SAS数据集A、B,假设A数据集中包含两列变量date_pregnancy和first_month,这二者均为日期变量,格式如下所示:
date_pregnancyfirst_month

2014/1/1

2014/1/28

2014/1/2

2014/1/29

2014/1/3

2014/1/30

2014/1/4

2014/1/31



B数据集中包含若干变量(数值型),假设其格式如下所示:
datemean_RHmean_pres

2014/1/1

68.5

1013.45

2014/1/2

80.5

1010.75

2014/1/3

80

1010.1

2014/1/4

60

1012.55

2014/1/5

60

1012.75

2014/1/6

78.5

1011.75

2014/1/7

80

1010.3

2014/1/8

83.5

1013

2014/1/9

62

1017.85

2014/1/10

70

1018.7

2014/1/11

77.5

1017.5

2014/1/12

77

1018.3

2014/1/13

66.5

1019.3

2014/1/14

67

1018.65

2014/1/15

68

1019.95

2014/1/16

75

1018.35

2014/1/17

76

1017.5

2014/1/18

50.5

1020.9

2014/1/19

62.5

1020.25

2014/1/20

62.5

1018.55

2014/1/21

34

1019.25

2014/1/22

48.5

1019.65

2014/1/23

68

1017.1

2014/1/24

76

1012.75

2014/1/25

81

1011.75

2014/1/26

75.5

1013

2014/1/27

79.5

1014.4

2014/1/28

83.5

1014.1

2014/1/29

81.5

1013.65

2014/1/30

80.5

1013.2

2014/1/31

74.5

1012.05



现在如何根据A数据集中变量date_pregnancy和first_month的取值,选择数据集B的子集,使得日期变量date大于等于日期变量date_pregnancy,但小于等于日期变量first_month,即date_pregnancy=<date<=first_month,产生数据集B的子集B_sub,然后分别对子集B_sub的变量mean_RH和mean_pres计算平均值,形成新的变量mean_RH_1和mean_pres_1,并将新的变量mean_RH_1和mean_pres_1放入到A数据集中,形成如何格式的数据集:
date_pregnancyfirst_monthmean_RH_1mean_pres_1

2014/1/1

2014/1/28

<新值><新值>

2014/1/2

2014/1/29

<新值><新值>

2014/1/3

2014/1/30

<新值><新值>

2014/1/4

2014/1/31

<新值><新值>


有什么好的办法吗?非常感谢!




关键词:SAS
勇敢者总是孤单的。

沙发
caibirdcnb 发表于 2017-11-11 13:09:30
你这个问题很难,分数太少。
1. 将A和B做笛卡尔全连接,之后只保留date在两个日期之间的。
2. 汇总数据。
  1. proc sql;
  2.         create table x as
  3.                 select *
  4.                         from lib.a,lib.b
  5.                                 having date_pregnancy<date<first_month;
  6.         select date_pregnancy,first_month,mean(mean_RH) as mean_RH,mean(mean_pres) as mean_pres,count(*) as N
  7.                 from x
  8.                         group by date_pregnancy,first_month;
  9. quit;
复制代码
已有 1 人评分论坛币 收起 理由
littlesas + 1 精彩帖子

总评分: 论坛币 + 1   查看全部评分

藤椅
littlesas 发表于 2017-11-11 19:44:21
您好!谢谢您的参与!您的代码产生的结果还不是我想要的结果。我重新描述一下:
现有SAS数据集A,其包含多个变量,有两个变量date_pregnancy和first_month(均为日期型变量),下面为A数据集的简化格式:
death        date_pregnancy        first_month
1        2014/1/1        2014/1/28
0        2014/1/1        2014/1/28
1        2014/1/1        2014/1/28
0        2014/1/1        2014/1/28
0        2014/1/1        2014/1/28
1        2014/1/2        2014/1/29
0        2014/1/2        2014/1/29
1        2014/1/2        2014/1/29
0        2014/1/2        2014/1/29
0        2014/1/3        2014/1/30
0        2014/1/3        2014/1/30
0        2014/1/3        2014/1/30
1        2014/1/3        2014/1/30
0        2014/1/3        2014/1/30
1        2014/1/3        2014/1/30
0        2014/1/3        2014/1/30
0        2014/1/3        2014/1/30

现在需要根据数据集A的变量date_pregnancy和first_month的取值情况,对数据集B进行筛选和计算。
1)筛选方面具体是:按照date变量在date_pregnancy和first_month之间的范围(即日期型变量date大于等于date_pregnancy,但date小于等于first_month),选取数据集B的观测;
2)在第1)的基础上,对所选取数据集B的观测进行均值计算,分别计算数据集B中变量mean_RH、mean_pres、mean_temp和max_temp的均值。实际上,此时这些变量所计算产生的均值是根据数据集B中date变量在date_pregnancy和first_month时间范围内mean_RH、mean_pres、mean_temp和max_temp的均值。
数据集B的格式如下:
date              mean_RH        mean_pres        mean_temp        max_temp
2014/1/1        68.5               1013.45      10.45           20.85
2014/1/2        80.5           1010.75         12.1            21.8
2014/1/3        80             1010.1         16.45           24.4
2014/1/4        60             1012.55         15.5            20.9
2014/1/5        60             1012.75           12.3            20.5
2014/1/6        78.5           1011.75        12.95           21
2014/1/7        80             1010.3          16.85           21.75
2014/1/8        83.5           1013            15.55           18
2014/1/9        62             1017.85          12.75           15.8
2014/1/10        70             1018.7          12.7            18.1
2014/1/11        77.5            1017.5          14.75            22.45
2014/1/12        77             1018.3          14.05            19.55
2014/1/13        66.5           1019.3          10.35            13.65
2014/1/14        67             1018.65          10.25            16.45
2014/1/15        68             1019.95          9.25            17.8
2014/1/16        75              1018.35          9.6             19.5
2014/1/17        76             1017.5          11.2            20.8
2014/1/18        50.5           1020.9          13.45            21.2
2014/1/19        62.5           1020.25          10.1            18.45
2014/1/20        62.5           1018.55          11.7            20.8
.................................
(数据省略)
.................................

然后,根据以上条件产生的变量mean_RH、mean_pres、mean_temp和max_temp的均值,匹配到数据集A中,形成如下格式:
deathdate_pregnancyfirst_monthmean_RH_meanmean_pres_meanmean_temp_meanmax_temp_mean
12014/1/12014/1/28新值新值新值新值
02014/1/12014/1/28新值新值新值新值
12014/1/12014/1/28新值新值新值新值
02014/1/12014/1/28新值新值新值新值
02014/1/12014/1/28新值新值新值新值
12014/1/22014/1/29新值新值新值新值
02014/1/22014/1/29新值新值新值新值
12014/1/22014/1/29新值新值新值新值
02014/1/22014/1/29新值新值新值新值
02014/1/32014/1/30新值新值新值新值
02014/1/32014/1/30新值新值新值新值
02014/1/32014/1/30新值新值新值新值
12014/1/32014/1/30新值新值新值新值
02014/1/32014/1/30新值新值新值新值
12014/1/32014/1/30新值新值新值新值
02014/1/32014/1/30新值新值新值新值
02014/1/32014/1/30新值新值新值新值



非常感谢高手能够帮忙解决一下!





板凳
littlesas 发表于 2017-11-11 23:16:06
caibirdcnb 发表于 2017-11-11 13:09
你这个问题很难,分数太少。
1. 将A和B做笛卡尔全连接,之后只保留date在两个日期之间的。
2. 汇总数据。 ...
您好!谢谢您的参与!您的代码产生的结果还不是我想要的结果。我重新描述一下:
现有SAS数据集A,其包含多个变量,有两个变量date_pregnancy和first_month(均为日期型变量),下面为A数据集的格式:
death        date_pregnancy        first_month
1        2014/1/1        2014/1/28
0        2014/1/1        2014/1/28
1        2014/1/1        2014/1/28
0        2014/1/1        2014/1/28
0        2014/1/1        2014/1/28
1        2014/1/2        2014/1/29
0        2014/1/2        2014/1/29
1        2014/1/2        2014/1/29
0        2014/1/2        2014/1/29
0        2014/1/3        2014/1/30
0        2014/1/3        2014/1/30
0        2014/1/3        2014/1/30
1        2014/1/3        2014/1/30
0        2014/1/3        2014/1/30
1        2014/1/3        2014/1/30
0        2014/1/3        2014/1/30
0        2014/1/3        2014/1/30

现在需要根据数据集A的变量date_pregnancy和first_month的取值情况,对数据集B进行筛选和计算。
1)筛选方面具体是:按照date变量在date_pregnancy和first_month之间的范围(即日期型变量date大于等于date_pregnancy,但date小于等于first_month),选取数据集B的观测;
2)在第1)的基础上,对所选取数据集B的观测进行均值计算,分别计算数据集B中变量mean_RH、mean_pres、mean_temp和max_temp的均值。实际上,此时这些变量所计算产生的均值是根据数据集B中date变量在date_pregnancy和first_month时间范围内mean_RH、mean_pres、mean_temp和max_temp的均值。
数据集B的格式如下:
date              mean_RH        mean_pres        mean_temp        max_temp
2014/1/1        68.5               1013.45      10.45           20.85
2014/1/2        80.5           1010.75         12.1            21.8
2014/1/3        80             1010.1         16.45           24.4
2014/1/4        60             1012.55         15.5            20.9
2014/1/5        60             1012.75           12.3            20.5
2014/1/6        78.5           1011.75        12.95           21
2014/1/7        80             1010.3          16.85           21.75
2014/1/8        83.5           1013            15.55           18
2014/1/9        62             1017.85          12.75           15.8
2014/1/10        70             1018.7          12.7            18.1
2014/1/11        77.5            1017.5          14.75            22.45
2014/1/12        77             1018.3          14.05            19.55
2014/1/13        66.5           1019.3          10.35            13.65
2014/1/14        67             1018.65          10.25            16.45
2014/1/15        68             1019.95          9.25            17.8
2014/1/16        75              1018.35          9.6             19.5
2014/1/17        76             1017.5          11.2            20.8
2014/1/18        50.5           1020.9          13.45            21.2
2014/1/19        62.5           1020.25          10.1            18.45
2014/1/20        62.5           1018.55          11.7            20.8
.................................
(数据省略)
.................................

然后,根据以上条件产生的变量mean_RH、mean_pres、mean_temp和max_temp的均值,匹配到数据集A中,形成如下格式:
death        date_pregnancy        first_month        mean_RH_mean        mean_pres_mean        mean_temp_mean        max_temp_mean
1        2014/1/1        2014/1/28        新值        新值        新值        新值
0        2014/1/1        2014/1/28        新值        新值        新值        新值
1        2014/1/1        2014/1/28        新值        新值        新值        新值
0        2014/1/1        2014/1/28        新值        新值        新值        新值
0        2014/1/1        2014/1/28        新值        新值        新值        新值
1        2014/1/2        2014/1/29        新值        新值        新值        新值
0        2014/1/2        2014/1/29        新值        新值        新值        新值
1        2014/1/2        2014/1/29        新值        新值        新值        新值
0        2014/1/2        2014/1/29        新值        新值        新值        新值
0        2014/1/3        2014/1/30        新值        新值        新值        新值
0        2014/1/3        2014/1/30        新值        新值        新值        新值
0        2014/1/3        2014/1/30        新值        新值        新值        新值
1        2014/1/3        2014/1/30        新值        新值        新值        新值
0        2014/1/3        2014/1/30        新值        新值        新值        新值
1        2014/1/3        2014/1/30        新值        新值        新值        新值
0        2014/1/3        2014/1/30        新值        新值        新值        新值
0        2014/1/3        2014/1/30        新值        新值        新值        新值

期待高手能够帮忙解决一下,非常感谢!

报纸
caibirdcnb 发表于 2017-11-12 10:00:31
littlesas 发表于 2017-11-11 23:16
您好!谢谢您的参与!您的代码产生的结果还不是我想要的结果。我重新描述一下:
现有SAS数据集A,其包含 ...
我再看了一遍你的描述,觉得我之前的代码就是你的需求。你用我的代码运行一下,告诉我哪一条不符合你的描述。

地板
1229784736 学生认证  发表于 2017-11-12 11:41:16
proc sql;
        create table tmp as
                select death,
                       date_pregnancy,
                       first_month,
                       mean(mean_RH) as mean_RH_mean,
                       mean(mean_pres) as mean_pres_mean,
                       mean(mean_temp) as mean_temp_mean,
                       mean(max_temp) as max_temp_mean
                from (selrct *
                      from work.A
                      join work.B
                      on date_pregnancy<=date<=first_month)
                group by date_pregnancy, first_month;
quit;

7
littlesas 发表于 2017-11-12 22:32:20
谢谢你们的解决方案!马上试试!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-17 12:13