楼主: dxystata
601 7

[问答] 为什么variable的后3个观测值是空的? [推广有奖]

版主

大师

34%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
182633 个
通用积分
15205.6089
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
291306 点
帖子
5378
精华
1
在线时间
13479 小时
注册时间
2006-6-21
最后登录
2024-4-28

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

20论坛币
  1. data aaa;
  2. input grpcat$;
  3. cards;
  4. aa
  5. bb
  6. ccc
  7. ;
  8. run;

  9. data aaa1;
  10.         length variable $20.;
  11.         if _n_=1 then variable="Week 2";
  12.         output;
  13.         set aaa;
  14.         if not missing(grpcat) then variable="\li200 "||grpcat;
  15. run;
复制代码
希望得到的数据集为:
variable
Week 2
\li200 aa
\li200 bb
\li200 ccc

谢谢!

最佳答案

whymath 查看完整内容

试比较以下两段程序: 程序一(原程序,删去了if语句以使得逻辑更为简单): 结果为: 程序二: 结果为: 略加分析,即可知程序一(原程序)中的 output 语句错误的使用逻辑与 set 语句自带的读入新的一行时初始化变量值的特性起了作用,导致 variable 除第一行外全为空值。 建议将原程序修改如下: 第一个 output 语句受到 if 条件约束,将仅执行一次。 第二个 output 语句将 aaa 数据集逐行读入,处理,然后输出 ...
关键词:Variable ABLE ABL IAB VaR
沙发
whymath 发表于 2022-4-18 22:46:08 |只看作者 |坛友微信交流群
试比较以下两段程序:
程序一(原程序,删去了if语句以使得逻辑更为简单):
  1. data aaa1;
  2.   length variable $20.;
  3.   if _n_=1 then variable="Week 2";
  4.   output;
  5.   set aaa;
  6.   variable="\li200 "||grpcat;
  7. run;
复制代码
结果为:
1.png
程序二:
  1. data aaa1;
  2.   length variable $20.;
  3.   if _n_=1 then variable="Week 2";
  4.   output;
  5.   set aaa;
  6.   variable="\li200 "||grpcat;
  7.   output;
  8. run;
复制代码

结果为:
2.png
略加分析,即可知程序一(原程序)中的 output 语句错误的使用逻辑与 set 语句自带的读入新的一行时初始化变量值的特性起了作用,导致 variable 除第一行外全为空值。

建议将原程序修改如下:
  1. data aaa1;
  2.   length variable $20.;
  3.   if _n_=1 then do;
  4.     variable="Week 2";
  5.     output;
  6.   end;
  7.   set aaa;
  8.   variable="\li200 "||grpcat;
  9.   output;
  10. run;
复制代码
第一个 output 语句受到 if 条件约束,将仅执行一次。
第二个 output 语句将 aaa 数据集逐行读入,处理,然后输出。

最后,稍加改造,可以实现在一个数据集的任意行前插入一行的通用写法。示例如下:
  1. data aaa1;
  2.   set aaa;

  3.   if _n_=1 then do;
  4.     call missing(of _all_);
  5.     variable="Week 2";
  6.     output;
  7.     set aaa point=_n_;
  8.     output;
  9.   end;
  10.   else output;
  11. run;
复制代码

此法的关键,在于理解和掌握数据指针 point= 选项和 output 语句的用法。掌握后,也可推广到在任意指定行前插入任意行,甚至插入一个或多个数据集的情形。
已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
dxystata + 100 + 2 + 2 + 2 热心帮助其他会员

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

SASUSER

使用道具

藤椅
橙红的果士 学生认证  发表于 2022-4-19 10:11:23 |只看作者 |坛友微信交流群
data aaa;
input grpcat$;
cards;
aa
bb
ccc
;
run;
/*Method 1*/
data aaa1;
        length variable $20.;
        if _n_=1 then variable="Week 2";
        output;
        set aaa;
/*        if not missing(grpcat) then variable="\li200 "||grpcat;*/  /*这一步在该数据步并未产生作用,此步数据集的基础是aaa,其中是没有variable变量的,variable变量存在于aaa1数据集中,所以想要衍生新变量要基于aaa1数据集*/
run;

data aaa2;
        set aaa1;
        if not missing(grpcat) then variable="\li200 "||grpcat;
run;

使用道具

板凳
橙红的果士 学生认证  发表于 2022-4-19 10:13:02 |只看作者 |坛友微信交流群
  1. data aaa;
  2. input grpcat$;
  3. cards;
  4. aa
  5. bb
  6. ccc
  7. ;
  8. run;
  9. /*Method 1*/
  10. data aaa1;
  11.         length variable $20.;
  12.         if _n_=1 then variable="Week 2";
  13.         output;
  14.         set aaa;
  15. /*        if not missing(grpcat) then variable="\li200 "||grpcat;*/ /*这一步在该数据步并未产生作用,此步数据集的基础是aaa,其中是没有variable变量的,variable变量存在于aaa1数据集中,所以想要衍生新变量要基于aaa1数据集*/
  16. run;

  17. data aaa2;
  18.         set aaa1;
  19.         if not missing(grpcat) then variable="\li200 "||grpcat;
  20. run;
复制代码


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

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

使用道具

报纸
whymath 发表于 2022-4-19 20:30:48 |只看作者 |坛友微信交流群
试比较以下两段程序:
程序一:
  1. data aaa1;
  2.   length variable $20.;
  3.   if _n_=1 then variable="Week 2";
  4.   output;
  5.   set aaa;
  6.   variable="\li200 "||grpcat;
  7. run;
复制代码
输出为: 1.png
程序二:
输出为:

SASUSER

使用道具

地板
橙红的果士 学生认证  发表于 2022-4-20 09:18:17 |只看作者 |坛友微信交流群
whymath 发表于 2022-4-19 20:51
试比较以下两段程序:
程序一(原程序,删去了if语句以使得逻辑更为简单):
结果为:
厉害了厉害了

使用道具

7
dxystata 发表于 2022-4-22 08:39:09 |只看作者 |坛友微信交流群
橙红的果士 发表于 2022-4-20 09:18
厉害了厉害了
请以附件出售的形式上传,给你补论坛币。

使用道具

8
橙红的果士 学生认证  发表于 2022-4-22 08:53:36 |只看作者 |坛友微信交流群
哈哈哈

10.1002@sim.8534.pdf

1.56 MB

需要: 20 个论坛币  [购买]

哈哈哈

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 20:43