楼主: andy162639
6385 17

如何自动识别将数据库中字符型变量批量变为数值型变量 [推广有奖]

  • 3关注
  • 6粉丝

已卖:494份资源

教授

90%

还不是VIP/贵宾

-

威望
0
论坛币
7002 个
通用积分
229.5706
学术水平
14 点
热心指数
15 点
信用等级
4 点
经验
8631 点
帖子
1205
精华
0
在线时间
1317 小时
注册时间
2010-5-5
最后登录
2025-12-21

楼主
andy162639 发表于 2015-6-18 11:47:12 |AI写论文
500论坛币
data a;
input id name$ drgif$ dn msd$;
cards;
1 zhang 1  1  白细胞
2 li         2  1  红细胞
3 chen  2  2  1个
;
run;
请教各位高手,如何在数据库中将字符型变量批量转化为数值型变量?如数据库所示,如果变量所有值都是数字的统一改为数值型变量。感谢!


最佳答案

Tigflanker 查看完整内容

如此来说,你需要增加一数组的变量了;因为对于NG、NE,万一其他指标也有的话,也是不应被转换的。 我考虑过对于整个col,只有NG、NE和数值的情况,才进行转换。 你应该是药厂或者CRO的兄弟吧,虽然NG、NE不会出现在名称指标中,不过还是要谨慎些。
关键词:字符型变量 字符型 数值型 数据库 Input 数据库 白细胞 zhang 红细胞 如何
有人说,统计归根结底就是个P

沙发
Tigflanker 发表于 2015-6-18 11:47:13
andy162639 发表于 2015-6-18 17:21
不要意思,刚才理解错误,您的macro是可以的,还有个问题,比如数据库中某个变量绝大部分都是数字,但有 ...
  1. data a;
  2. input id name $ drgif $ dn msd $;
  3. cards;
  4. 1 NGN    1  1  白细胞
  5. 2 NEC   NE  1  红细胞
  6. 3 NG    NG  2  1个
  7. ;
  8. run;

  9. %macro zhuan(in = ,out = );
  10. %let rc = %sysfunc(open(&in.(keep = _char_)));
  11. %let cn = %sysfunc(attrn(&rc.,nvars));
  12. %let rc = %sysfunc(close(&rc.));

  13. data &out.;
  14.   set &in.(in = in) &in. end = last;

  15.   array allchar _char_;
  16.   array newchar newchar1 - newchar&cn.;
  17.   array tmpchar $ tmpchar1 - tmpchar&cn.;
  18.   array temp temp1 - temp&cn.;
  19.   retain temp;

  20.   prx = prxparse('/[^\d\.\s\-]/');
  21.   if last then call execute('data &out.(drop = tmp:);set &out;');
  22.   do over allchar;
  23.     tmpchar = ifc(upcase(allchar) in ('NE','NG'),'',allchar);
  24.     if in then temp = max(temp,prxmatch(prx,tmpchar));
  25.           else if ~temp then newchar = input(tmpchar,best.);
  26.         if last then do;
  27.       if ~temp then call execute(cat('drop ',vname(allchar),';rename ',vname(newchar),' = ',vname(allchar),';'));
  28.             else call execute(cat('drop ',vname(newchar),';'));
  29.         end;
  30.   end;
  31.   if last then call execute('run;');

  32.   if ~in;
  33.   drop temp: prx;
  34. run;
  35. %mend zhuan;

  36. %zhuan(in = a, out = b);
复制代码
如此来说,你需要增加一数组的变量了;因为对于NG、NE,万一其他指标也有的话,也是不应被转换的。

我考虑过对于整个col,只有NG、NE和数值的情况,才进行转换。

你应该是药厂或者CRO的兄弟吧,虽然NG、NE不会出现在名称指标中,不过还是要谨慎些。
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
andy162639 + 5 + 3 + 3 + 3 精彩帖子

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

Bye SAS.
若有缘,能重聚。

藤椅
yang1015661763 发表于 2015-6-18 12:48:15
input语句可以实现,但是我没有试过,再说你这都是文字?还怎么转?转ASCII?
已有 1 人评分论坛币 热心指数 收起 理由
andy162639 + 2 + 2 精彩帖子

总评分: 论坛币 + 2  热心指数 + 2   查看全部评分

板凳
andy162639 发表于 2015-6-18 13:34:25
不是,带文字的不需要转,只是转所有全部都是数字的变量,我放一些带文字的变量意思是数据库里需要转的变量不是连着的

报纸
extension 发表于 2015-6-18 13:53:08
if anyalpha(msd)=0 then msd_n=input(msd,best.); 也可以写正则判断,更准确
已有 1 人评分论坛币 热心指数 收起 理由
andy162639 + 3 + 1 精彩帖子

总评分: 论坛币 + 3  热心指数 + 1   查看全部评分

地板
andy162639 发表于 2015-6-18 14:17:37
extension 发表于 2015-6-18 13:53
if anyalpha(msd)=0 then msd_n=input(msd,best.); 也可以写正则判断,更准确
这样只是一个一个判断,怎么批量判断呢?

7
Tigflanker 发表于 2015-6-18 16:35:29
有意思,占位待编辑,以前宏中写过

当时是把整个数据集的整个字符型数值遍历测试了一边,总感觉效率也是有点差
  1. data a;
  2. input id name $ drgif $ dn msd $;
  3. cards;
  4. 1 zhang 1  1  白细胞
  5. 2 li    2  1  红细胞
  6. 3 chen  2  2  1个
  7. ;
  8. run;

  9. %macro zhuan(in = ,out = );
  10. %let rc = %sysfunc(open(&in.(keep = _char_)));
  11. %let cn = %sysfunc(attrn(&rc.,nvars));
  12. %let rc = %sysfunc(close(&rc.));

  13. data &out.;
  14.   set &in.(in = in) &in. end = last;

  15.   array allchar _char_;
  16.   array newchar newchar1 - newchar&cn.;
  17.   array temp temp1 - temp&cn.;
  18.   retain temp;

  19.   prx = prxparse('/[^\d\.\s\-]/');  /*sorry,还有负号漏了*/
  20.   if last then call execute('data &out.;set &out;');
  21.   do over allchar;
  22.     if in then temp = max(temp,prxmatch(prx,allchar));
  23.           else if ~temp then newchar = input(allchar,best.);
  24.         if last then do;
  25.       if ~temp then call execute(cat('drop ',vname(allchar),';rename ',vname(newchar),' = ',vname(allchar),';'));
  26.             else call execute(cat('drop ',vname(newchar),';'));
  27.         end;
  28.   end;
  29.   if last then call execute('run;');

  30.   if ~in;
  31.   drop temp: prx;
  32. run;
  33. %mend zhuan;

  34. %zhuan(in = a, out = b);
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
andy162639 + 5 + 2 + 3 + 3 精彩帖子

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

8
andy162639 发表于 2015-6-18 17:08:01
Tigflanker 发表于 2015-6-18 16:35
有意思,占位待编辑,以前宏中写过

当时是把整个数据集的整个字符型数值遍历测试了一边,总感觉效率也是 ...
还有点问题,您的macro跑完后,应该保留的字符型变量都变为缺失值了,怎么修改一下呢?

9
andy162639 发表于 2015-6-18 17:14:56
Tigflanker 发表于 2015-6-18 16:35
有意思,占位待编辑,以前宏中写过

当时是把整个数据集的整个字符型数值遍历测试了一边,总感觉效率也是 ...
data a;
不要意思,刚才理解错误,您的macro是可以的,还有个问题,比如某个变量绝大部分都是数字,但有个别是NK或者其他标示,能否把这类变量中NK变为缺失,然后也转化为数值型呢?求教,不甚感激。

input id name $ drgif $ dn $ msd $;
cards;
1 zhang 1  1    白细胞
2 li        2  .     红细胞
3 chen  2  NK  1个
;
run;

10
Tigflanker 发表于 2015-6-18 17:15:03
andy162639 发表于 2015-6-18 17:08
还有点问题,您的macro跑完后,应该保留的字符型变量都变为缺失值了,怎么修改一下呢?
我这边正常的,你模拟调试一下。

捕获.PNG
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
andy162639 + 5 + 3 + 3 + 3 精彩帖子

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

Bye SAS.
若有缘,能重聚。

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

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