f*********8 发帖数: 165 | 1 id refid
1 NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
2 NP_001135417 /// NP_001604
3 NP_00499494
我想从一个record生成多个observations, 但是每个record对应的obs个数不等,特殊
符号是‘///’。请问应该怎末处理啊?
我的问题是打印出来的结果只有8位,但是每个值的长度不是固定的,一旦写成$12.,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢!
data new;
infile "C:............" missover dlm="///" ;
input id $ refid $ @;
num=0;
do while (refid ne ' ');
num+1;
output;
input r |
t**i 发帖数: 688 | |
g******h 发帖数: 266 | 3 我是新手,所以不知道很多语法方面的细节。不过这个问题我的想法是,先用$12.把数
据读出来,然后用substring的办法把多余的///去掉。我现在能想到的是先挑like '*/
'的,再挑 '*//'的,再挑‘*///’的。逐一去掉///的部分。好像记得是用substring
的办法可以选出前多少位的字符串。忘记具体语法了。
你要是能把我的想法用SAS实现,在版上贴一下具体code。共同进步。:)
,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢!
【在 f*********8 的大作中提到】 : id refid : 1 NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711 : 2 NP_001135417 /// NP_001604 : 3 NP_00499494 : 我想从一个record生成多个observations, 但是每个record对应的obs个数不等,特殊 : 符号是‘///’。请问应该怎末处理啊? : 我的问题是打印出来的结果只有8位,但是每个值的长度不是固定的,一旦写成$12.,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢! : data new; : infile "C:............" missover dlm="///" ; : input id $ refid $ @;
|
A*******s 发帖数: 3942 | 4 comment:
1. dlm="/" SAS默认两个或以上的delimiter为一个
2. :$12. informat 之前加colon,sas会在遇到space和delimiter时停止读入
3. id 4. 这个我不是很确定。如果将id的informat改成$,似乎sas会将后面的空格
和refid一起读入,然后保留前八位再把后面的空格去掉。我不知道怎么解决,只能把
id当做numeric读入就行了。
改了一下,运行好像没错,sample code如下
data new;
infile "**********" missover dlm="/" ;
input id 4. refid :$12. @;
num=0;
do while (refid ne ' ');
num+1;
output;
input refid :$12. @;
end;
run;
proc print;
run
【在 f*********8 的大作中提到】 : id refid : 1 NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711 : 2 NP_001135417 /// NP_001604 : 3 NP_00499494 : 我想从一个record生成多个observations, 但是每个record对应的obs个数不等,特殊 : 符号是‘///’。请问应该怎末处理啊? : 我的问题是打印出来的结果只有8位,但是每个值的长度不是固定的,一旦写成$12.,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢! : data new; : infile "C:............" missover dlm="///" ; : input id $ refid $ @;
|
P****D 发帖数: 11146 | 5 这条很有用!学会了。
【在 A*******s 的大作中提到】 : comment: : 1. dlm="/" SAS默认两个或以上的delimiter为一个 : 2. :$12. informat 之前加colon,sas会在遇到space和delimiter时停止读入 : 3. id 4. 这个我不是很确定。如果将id的informat改成$,似乎sas会将后面的空格 : 和refid一起读入,然后保留前八位再把后面的空格去掉。我不知道怎么解决,只能把 : id当做numeric读入就行了。 : 改了一下,运行好像没错,sample code如下 : data new; : infile "**********" missover dlm="/" ; : input id 4. refid :$12. @;
|
f*********8 发帖数: 165 | 6 多谢多谢。
我试了这个 id 4.怎末id 都变成 missing 了?!
infile的format 是不是有问题。我的数据存成 .csv
其实真正的id是char type,而且大于8位,就像你说的会把后面的空格和部分refid读进
去。我只好用id来简化问题。不过可以用这个数字id map 回原来的id。
能否在指教一下,如果id 是char, 大于8位。 id 和refid之间的dlm=" ",但是refid
dlm='/'有没有办法把两个variable 同时正确读入呢?谢谢。
例如:
id refid
14454544_a NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
2222222222222_b NP_001135417 /// NP_001604 |
l*********s 发帖数: 5409 | 7 dlm option shall also include the space character.
refid
【在 f*********8 的大作中提到】 : 多谢多谢。 : 我试了这个 id 4.怎末id 都变成 missing 了?! : infile的format 是不是有问题。我的数据存成 .csv : 其实真正的id是char type,而且大于8位,就像你说的会把后面的空格和部分refid读进 : 去。我只好用id来简化问题。不过可以用这个数字id map 回原来的id。 : 能否在指教一下,如果id 是char, 大于8位。 id 和refid之间的dlm=" ",但是refid : dlm='/'有没有办法把两个variable 同时正确读入呢?谢谢。 : 例如: : id refid : 14454544_a NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
|
A*******s 发帖数: 3942 | 8 我尝试了一下同时用两个dlm=option,然后把id改成:$16.
dlm='/' dlm=' '
因为源文件格式有点混乱
两个refid之间间隔的,有时候是"/// ", 有时候是" /// "
所以没法读到正确的结果
而且我也搞不明白sas怎么处理两个dlm= option
如果次序不一样,结果也会不一样,有趣。
我还尝试了用 @'NP_' 控制sas读入NP_之后的字符串
好像也不太行,不过结果比较接近,只是第一个refid后面带///
看看大牛们有啥办法处理这种有两种dlm的源文件
你应该打一顿data entry的那个人,太messy了,哈哈
refid
【在 f*********8 的大作中提到】 : 多谢多谢。 : 我试了这个 id 4.怎末id 都变成 missing 了?! : infile的format 是不是有问题。我的数据存成 .csv : 其实真正的id是char type,而且大于8位,就像你说的会把后面的空格和部分refid读进 : 去。我只好用id来简化问题。不过可以用这个数字id map 回原来的id。 : 能否在指教一下,如果id 是char, 大于8位。 id 和refid之间的dlm=" ",但是refid : dlm='/'有没有办法把两个variable 同时正确读入呢?谢谢。 : 例如: : id refid : 14454544_a NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
|
A*******s 发帖数: 3942 | 9 嗯?我把你贴的sample data存成txt,没问题。
难道是csv的问题?
refid
【在 f*********8 的大作中提到】 : 多谢多谢。 : 我试了这个 id 4.怎末id 都变成 missing 了?! : infile的format 是不是有问题。我的数据存成 .csv : 其实真正的id是char type,而且大于8位,就像你说的会把后面的空格和部分refid读进 : 去。我只好用id来简化问题。不过可以用这个数字id map 回原来的id。 : 能否在指教一下,如果id 是char, 大于8位。 id 和refid之间的dlm=" ",但是refid : dlm='/'有没有办法把两个variable 同时正确读入呢?谢谢。 : 例如: : id refid : 14454544_a NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
|
D******n 发帖数: 2836 | 10 data a1;
infile './yourdata' missover;
length refid $ 32;
input id $ refid $ @;
do while (refid ne ' ');
refid=compress(refid,"/");
if (refid ne ' ') then output;
input refid $ @;
end;
run;
proc print ;run;
,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢!
【在 f*********8 的大作中提到】 : id refid : 1 NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711 : 2 NP_001135417 /// NP_001604 : 3 NP_00499494 : 我想从一个record生成多个observations, 但是每个record对应的obs个数不等,特殊 : 符号是‘///’。请问应该怎末处理啊? : 我的问题是打印出来的结果只有8位,但是每个值的长度不是固定的,一旦写成$12.,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢! : data new; : infile "C:............" missover dlm="///" ; : input id $ refid $ @;
|
D******n 发帖数: 2836 | 11 这种data还好,其实是用错了工具,data cleaning从来就不是SAS该做的东西。用perl
或者其他编程语言都比较好搞。SAS不是不行,而是思维不能很直接。linux 下面可以这
样搞。
sed -e 's/\///g' yourdata.dat | perl -e 'while() {@a=split(" ",$_);$i
d=shift @a;for (@a) {print "$id $_\n"}}'
【在 A*******s 的大作中提到】 : 我尝试了一下同时用两个dlm=option,然后把id改成:$16. : dlm='/' dlm=' ' : 因为源文件格式有点混乱 : 两个refid之间间隔的,有时候是"/// ", 有时候是" /// " : 所以没法读到正确的结果 : 而且我也搞不明白sas怎么处理两个dlm= option : 如果次序不一样,结果也会不一样,有趣。 : 我还尝试了用 @'NP_' 控制sas读入NP_之后的字符串 : 好像也不太行,不过结果比较接近,只是第一个refid后面带/// : 看看大牛们有啥办法处理这种有两种dlm的源文件
|
y****n 发帖数: 46 | 12 data temp;
length id refid $12;
infile cards truncover ;
input @;
id=scan(_infile_,1,' ///');
i=2;
do while (scan(_infile_,i,' ///') ne ' ' );
refid=Scan(_infile_,i,' ///');
output;
I=i+1;
end;
keep id refid;
cards;
1 NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
2 NP_001135417 /// NP_001604
3 NP_00499494
;
run; |
d*******1 发帖数: 854 | 13 先用proc import把csv file 读进去再说。 注意用guessingrows=XXXXXX.
然后再用tranwrd() 和scan() 把相应的record parse出来。
,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢!
【在 f*********8 的大作中提到】 : id refid : 1 NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711 : 2 NP_001135417 /// NP_001604 : 3 NP_00499494 : 我想从一个record生成多个observations, 但是每个record对应的obs个数不等,特殊 : 符号是‘///’。请问应该怎末处理啊? : 我的问题是打印出来的结果只有8位,但是每个值的长度不是固定的,一旦写成$12.,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢! : data new; : infile "C:............" missover dlm="///" ; : input id $ refid $ @;
|