楼主: iRoss2007
4041 8

[原创博文] modify中remove语句的若干疑惑 [推广有奖]

  • 0关注
  • 6粉丝

硕士生

80%

还不是VIP/贵宾

-

威望
0
论坛币
27691 个
通用积分
3.2888
学术水平
9 点
热心指数
11 点
信用等级
8 点
经验
6866 点
帖子
127
精华
0
在线时间
244 小时
注册时间
2008-12-3
最后登录
2022-9-4

楼主
iRoss2007 在职认证  学生认证  发表于 2012-9-25 21:22:35 |AI写论文
20论坛币
问题是这样的,小弟最近在用modify处理一些大数据,其中涉及到数据集的更新,按照nkwilling版主书中的方法采取了modify语句,但在应用中发现,remove观测后的数据集大小竟然不变!

例如数据集mst有100条观测,我要删除mst数据集中的前50条观测,remove语句如下:
data mst;
  do i=1 to 100;
   output;
  end;
run;

data mst;
  modify mst;
  if i le 50 then remove;
run;

最终的mst数据集只有50条观测,但他的大小没有发生变化!!(如果原数据集很大,会更加明显)打开数据集一看,观测序号不是从1开始,而是从50开始。如果这时我再运行proc append,新增的观测序号也是从101开始,也就是说,前面50条观测被删除了,但是还占着地方!!

翻看了一下help,里面有说道remove有物理和逻辑删除之分,具体和lib的属性有关。我用的lib引擎是v9,应该执行的物理删除,但为什么删不掉呢?

望各位高人解答。

最佳答案

hikaru1066 查看完整内容

參考 http://www.nesug.org/proceedings/nesug00/cc/cc4004.pdf 其中提到"Because no observations are read in or written out during processing, for an existing dataset, the MODIFY command is the best way to add a label, rename a variable, or change a format or informat." modify比較適合作為修改資料或是變數屬性 若是要更動到整個資料檔,應該用set會比較好 希望有回答到你的問題^^
关键词:modify REMOVE Move ODI Mod modify

本帖被以下文库推荐

沙发
hikaru1066 发表于 2012-9-25 21:22:36
參考 http://www.nesug.org/proceedings/nesug00/cc/cc4004.pdf

其中提到"Because no observations are read in or written out during processing, for an existing dataset, the MODIFY command is the best way to add a label, rename a variable, or change a format or informat."

modify比較適合作為修改資料或是變數屬性
若是要更動到整個資料檔,應該用set會比較好

希望有回答到你的問題^^

藤椅
iRoss2007 在职认证  学生认证  发表于 2012-9-26 10:37:58
没人么?自己顶一下
文(伪)科(码)男(农), 弹幕爱好者,微软脑残粉,萧亚轩脑残

板凳
hikaru1066 发表于 2012-9-26 12:44:04
用你寫的程式跑了SAS是OK的...
樣本數最後剩下50個
我的SAS版本是9.2

NOTE: SAS initialization used:
      real time           1.26 seconds
      cpu time            0.96 seconds

1    data mst;
2      do i=1 to 100;
3       output;
4      end;
5    run;

NOTE: The data set WORK.MST has 100 observations and 1 variables.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.00 seconds


6
7    data mst;
8      modify mst;
9      if i le 50 then remove;
10   run;

NOTE: There were 100 observations read from the data set WORK.MST.
NOTE: The data set WORK.MST has been updated.  There were 0 observations rewritten, 0
      observations added and 50 observations deleted.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.00 seconds

报纸
iRoss2007 在职认证  学生认证  发表于 2012-9-26 13:15:56
hikaru1066 发表于 2012-9-26 12:44
用你寫的程式跑了SAS是OK的...
樣本數最後剩下50個
我的SAS版本是9.2
对,样本数最后的确剩下50个,但打开数据集,观测序号是从51开始的,而非从1开始,并且数据集大小没有减少,我想问的是为什么数据集大小不变
文(伪)科(码)男(农), 弹幕爱好者,微软脑残粉,萧亚轩脑残

地板
hikaru1066 发表于 2012-9-26 13:54:40
若是把修改過後的data另存成新的檔(temp)
就可以看出觀測值僅剩50個
觀測序號也是從1開始
但就不是從修改原始檔的做法了...

data mst;
  do i=1 to 100;
   output;
  end;
run;

data mst;
  modify mst;
  if i le 50 then remove;
run;

data temp;
        set mst;
run;

7
iRoss2007 在职认证  学生认证  发表于 2012-9-26 14:11:24
hikaru1066 发表于 2012-9-26 13:59
參考 http://www.nesug.org/proceedings/nesug00/cc/cc4004.pdf

其中提到"Because no observations are  ...
的确,重新set数据集的话,变量的观测序号就对了。但我操纵的是一个大数据集,可能有上亿条观测,如果使用set命令,系统会在后台重新创建一个文件(.lck文件),这样我的磁盘空间会不够,而modify语句可以不创建.lck文件就能修改原数据集,这也是当初为何选择modify的原因。
文(伪)科(码)男(农), 弹幕爱好者,微软脑残粉,萧亚轩脑残

8
hikaru1066 发表于 2012-9-26 14:55:18
參考:http://www.jpsm.umd.edu/SAS/SASO ... 0477/m59/m59_58.htm

其中 "The descriptor portion of the SAS data set stays the same and the updated observation is written to the data set in the location of the original observation."

觀測序號也是descriptor portion的一種,所以只會看到原始檔案的序號
若要知道新的觀測序號,只能另立新檔案了

9
iRoss2007 在职认证  学生认证  发表于 2012-9-28 10:47:42
hikaru1066 发表于 2012-9-26 14:55
參考:http://www.jpsm.umd.edu/SAS/SASOnlineTutor/sot12/en/60477/m59/m59_58.htm

其中 "The descript ...
看来也只有这种办法了,论坛币就给你吧:)
文(伪)科(码)男(农), 弹幕爱好者,微软脑残粉,萧亚轩脑残

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 10:53