楼主: Rock2000
3299 10

[有偿编程] 怎样填补数据? [推广有奖]

  • 1关注
  • 24粉丝

已卖:6892份资源

学术权威

23%

还不是VIP/贵宾

-

威望
1
论坛币
104790 个
通用积分
51.9656
学术水平
55 点
热心指数
74 点
信用等级
48 点
经验
23510 点
帖子
520
精华
0
在线时间
10924 小时
注册时间
2004-5-27
最后登录
2025-11-12

楼主
Rock2000 发表于 2018-4-24 15:39:54 |AI写论文
20论坛币
有一数据,含sxid顺序(顺序ID)、ID(ID编号)、name(姓名)、group(组别),其中,ID有缺失,name有多个相同的记录,group相同(比如group=1)并且name相同代表是同一组,否则不是,现在想group及name相同,用有ID记录的值填补ID缺失缺失的值,比如现在用sxid=1 的ID值填到sxid=2的id中去,sxid=3仍然是缺失的,用SQL怎样实现?

  1. sxid        id               name        group
  2. 1        11600909        安程程       1
  3. 2        .                     安程程       1
  4. 3        .                    安程程        0
  5. 4        11601531        敖炜茹       1
  6. 5        .                     敖炜茹       1
  7. 6        .                     敖炜茹       1
  8. 7        .                     白芳          0
  9. 8        11605786        白芳          1
  10. 9        .                     白芳          1
  11. 10        .                  白佳丰        1
  12. 11        .                  白佳丰        0
  13. 12        11605173     白佳丰        1
复制代码


最佳答案

wwang111 查看完整内容

假设数据集的名字是test: proc sql; create table wanted as select sxid, b.id, a.name, a.group from test a left join (select distinct id, name, group from test where ^missing(id)) b on a.name=b.name and a.group=b.group order by 1; quit;
关键词:Group name sql

沙发
wwang111 发表于 2018-4-24 15:39:55
假设数据集的名字是test:

proc sql;
create table wanted as
select sxid, b.id, a.name, a.group
from test a left join (select distinct id, name, group from test where ^missing(id)) b
on a.name=b.name and a.group=b.group
order by 1;
quit;

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Rock2000 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
Rock2000 发表于 2018-4-24 15:44:00
最终填补结果如下图

1a.png

板凳
Tigflanker 发表于 2018-4-26 12:48:32
最近加班比较晚可能没空编写,您也可以尝试利用data步retain加一些if逻辑实现

报纸
Rock2000 发表于 2018-4-26 13:22:32
Tigflanker 发表于 2018-4-26 12:48
最近加班比较晚可能没空编写,您也可以尝试利用data步retain加一些if逻辑实现
谢谢,Data步有点啰嗦

地板
Rock2000 发表于 2018-4-26 13:22:34
Tigflanker 发表于 2018-4-26 12:48
最近加班比较晚可能没空编写,您也可以尝试利用data步retain加一些if逻辑实现
谢谢,Data步有点啰嗦

7
Tigflanker 发表于 2018-4-28 23:03:57
  1. data have;
  2.   input sxid id name $ group;
  3. cards;
  4. 1 11600909 安程程 1
  5. 2 . 安程程 1
  6. 3 . 安程程 0
  7. 4 11601531 敖炜茹 1
  8. 5 . 敖炜茹 1
  9. 6 . 敖炜茹 1
  10. 7 . 白芳 0
  11. 8 11605786 白芳 1
  12. 9 . 白芳 1
  13. 10 . 白佳丰 1
  14. 11 . 白佳丰 0
  15. 12 11605173 白佳丰 1
  16. ;run;

  17. proc sql;
  18.   create table want as
  19.   select sxid, max(id) as id, name, group
  20.   from have
  21.   group by name, group
  22.   order by sxid
  23.   ;
  24. quit;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Rock2000 + 5 + 1 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 1  热心指数 + 5  信用等级 + 5   查看全部评分

8
Rock2000 发表于 2018-5-3 21:40:55
Tigflanker 发表于 2018-4-28 23:03
发现用Max很妙,其实用Min也可以,能否解释下?MAX及MIN仅仅是最大或最小值,怎么能填补数据?谢谢。

9
Tigflanker 发表于 2018-5-4 13:51:58
Rock2000 发表于 2018-5-3 21:40
发现用Max很妙,其实用Min也可以,能否解释下?MAX及MIN仅仅是最大或最小值,怎么能填补数据?谢谢。
是这样的,其实也是卡着你这个题设了,更复杂的可能就不能这么用

在SQL里的max函数是“在group by”的组内,取出最大的值,然后将这个值再赋值到组内每一个obs中

而在SAS中,一般max(一组数值变量),缺失值永远是最小的值(假如不区分.和.A什么的),所以max(. , -10)= -10、max(0.5, .) = 0.5

10
Rock2000 发表于 2018-5-4 15:31:06
Tigflanker 发表于 2018-5-4 13:51
是这样的,其实也是卡着你这个题设了,更复杂的可能就不能这么用

在SQL里的max函数是“在group by”的 ...
学习了,谢谢。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-7 20:58