楼主: maomaokii
3916 7

[有偿编程] sas数据集,批量更改观测 [推广有奖]

  • 0关注
  • 0粉丝

本科生

21%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.2871
学术水平
4 点
热心指数
4 点
信用等级
2 点
经验
115 点
帖子
47
精华
0
在线时间
87 小时
注册时间
2012-4-19
最后登录
2023-2-7

楼主
maomaokii 发表于 2015-6-17 10:39:35 |AI写论文
10论坛币
   比如我有一个 数据集。里面有100个变量。其中有40个变量的名字是*_number 。就是以_number结尾的这些变量。
   我想把所有以number结尾的变量  乘以 一个0.8 然后赋值给自己。
   就是 这样
  比如
    data  a;
    input  id, a_number,b_number,c_number ;
    cards;
    1 100 200 300
    2 200 330 400
;
run;
    我就是要把 a_number,b_number,c_number 这三个变量 乘以 0.8 之后再赋值给a_number,b_number,c_number。
   就是 a_number = 0.8* a_number;
    因为数据集有很多个,而且每个数据集有很多 这样的变量,一个一个写很麻烦,想弄个宏, 就是_number结尾的自动 乘以0.8
    有没有大神解决下!!!

最佳答案

sas那个石家庄人 查看完整内容

参考了一个国外文献 data a; input id a_number b_number c_number ; cards; 1 100 200 300 2 200 330 400 ; run; proc contents data = a out=var_names(keep = name) noprint; run; data change; set var_names; where substr(name,length(name)-6) = "_number"; run; data _null_; file 'c:\change'; set change end = eof; if _n_ = 1 then put '%let allthev= '; put name; if eof the ...
关键词:sas数据集 数据集 Number Input cards 批量改观测

沙发
sas那个石家庄人 发表于 2015-6-17 10:39:36
参考了一个国外文献


data  a;
input  id  a_number b_number c_number ;
cards;
1 100 200 300
2 200 330 400
;
run;

proc contents data = a
out=var_names(keep = name) noprint;
run;

data change;
set var_names;
where substr(name,length(name)-6) = "_number";
run;

data _null_;
file 'c:\change';
set change end = eof;
if _n_ = 1 then put '%let allthev= ';
put name;
if eof then do;
call symput('num' , compress(_n_));
put ';';
put 'run;';
end;
run;

%include 'c:\change';


data result;
set a;
array x[&num] &allthev;
do i = 1 to #
x{i}=0.8*x{i};
end;
drop i;
run;

藤椅
maomaokii 发表于 2015-6-17 10:40:47
有没有人

板凳
sas那个石家庄人 发表于 2015-6-17 10:52:55
如果你的id是character variable 用array即可实现

data two;
set a ;
array change {*} _numeric_;
do i=1 to dim(change);
change{i}=0.8*change{i};
end;drop i;
run;

额抱歉啊 没看清楚 你是100个变量 只有40个需要求 但不需要求的变量里也有数值型变量是吗
我再继续想想

报纸
maomaokii 发表于 2015-6-17 11:29:12
sas那个石家庄人 发表于 2015-6-17 10:52
如果你的id是character variable 用array即可实现

data two;
是的啊呀。

地板
maomaokii 发表于 2015-6-17 15:29:37
sas那个石家庄人 发表于 2015-6-17 10:39
参考了一个国外文献
很完美的解决了问题,
改进的地方有,data _null_ 这一步,可以不用,直接 proc sql ;
select name into :list separated by ' ' from change ;
select count(*) into :count from change;
quit;
allthev 对应list
num 对应 count

7
sas那个石家庄人 发表于 2015-6-17 15:36:20
maomaokii 发表于 2015-6-17 15:29
很完美的解决了问题,
改进的地方有,data _null_ 这一步,可以不用,直接 proc sql ;
select name in ...
用proc sql生成macro variable确实更方便!

8
Tigflanker 发表于 2015-6-18 10:22:01
  1. data  a;
  2.     input  id a_number b_number c_number ;
  3.     cards;
  4.     1 100 200 300
  5.     2 200 330 400
  6. ;
  7. run;

  8. data b;
  9.   set a;

  10.   array x _numeric_;
  11.   do over x;
  12.     x = ifn(index(vname(x),'_number'),x * 0.8,x);
  13.   end;
  14. run;
复制代码
已有 1 人评分学术水平 热心指数 收起 理由
mingfeng07 + 1 + 1 观点有启发

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

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

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