楼主: shentt3214
2012 6

[问答] 跪求解答特殊情况下从混乱数据中读取观测值 [推广有奖]

  • 2关注
  • 1粉丝

高中生

2%

还不是VIP/贵宾

-

威望
0
论坛币
99 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
2621 点
帖子
19
精华
0
在线时间
21 小时
注册时间
2012-9-20
最后登录
2022-12-20

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有这样套数据情况,
(#+number表示数据所在行,原始数据中不存在)
#1 Data for 5 Questions
#2
#3 ABCDEAACCEBBBBBCB
#4 BDADDAACCABBBEEBBBB
#5 CACA

假设我有五个变量, Q1,Q2,Q3,Q4,Q5。从第三行开始读取数据。每个变量长度为1,字符型
实际运行结果,前2个观测为
OBS   Q1   Q2   Q3   Q4   Q5
  1       A      B     C     D     E
  2       A      A     C     C     E
实际一共为8个observation
问,如何写input statement, 最好结合使用abbreviated variable list and informat list使input statement尽量简短些
我写了这样一套程序
Data 'C:\Users\DING ZHIJIA\Documents\spring 2013\STAT 501\topic3\HW3_Problem6';
*Produces a permanent SAS data set stored in a folder with a name of your choice using direct
referencing, not via defining a SAS library.*;

infile 'C:\Users\DING ZHIJIA\Documents\spring 2013\STAT 501\topic3\Assignment3_Files\HW3_B.txt';
Input #3 (QUES1-QUES5) (8*$1.) @@;

/*Reads the data starting on line 3
  Names the variables QUES1, QUES2, QUES3, QUES4, and QUES5
  Uses an abbreviated variable list and informat list in the INPUT statement*/

RUN;

proc print data='C:\Users\DING ZHIJIA\Documents\spring 2013\STAT 501\topic3\HW3_Problem6';
run;
结果log说 有 lost card

infile 里添加了 stopover option
log 描述出因为每行长度不同所以丢失数据
ERROR: INPUT statement exceeded record length.
       INFILE C:\Users\DING ZHIJIA\Documents\spring 2013\STAT
       501\topic3\Assignment3_Files\HW3_B.txt OPTION STOPOVER specified.
RULE:     ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+---
3         ABCDEAACCEBBBBBCB 17
4         BDADDAACCABBBEEBBBB 19
5         CACA 4

这个错误如何修正?

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:观测值 求解答 observation referencing assignment 特殊

沙发
shentt3214 发表于 2013-2-9 00:29:09 |只看作者 |坛友微信交流群
自己顶一下

使用道具

藤椅
shentt3214 发表于 2013-2-9 00:36:29 |只看作者 |坛友微信交流群
= =没人吗

使用道具

板凳
a6566792 在职认证  发表于 2013-2-18 10:28:37 |只看作者 |坛友微信交流群
input ques1-ques5 $1. 这样子把空格也读成字符了,数据不大的话要么先把英文字母提取出来再读取?

使用道具

报纸
shentt3214 发表于 2013-2-19 04:09:25 |只看作者 |坛友微信交流群
a6566792 发表于 2013-2-18 10:28
input ques1-ques5 $1. 这样子把空格也读成字符了,数据不大的话要么先把英文字母提取出来再读取?
差不多,我把文件导入txt,用infile从外部读取,问题修正了。从内部直接生成,会让数据不连续,每行结尾会多出来好多missing value
不过还是谢谢

使用道具

地板
bjtoronto 发表于 2013-2-19 07:19:40 |只看作者 |坛友微信交流群
1) 如果是特殊情况,假设原始数据格式如下。建立数据文件TestData.txt
Data for 5 Questions

ABCDEAACCEBBBBBCB
BDADDAACCABBBEEBBBB
CACA

2) 从第三行读取原始数据。
data test;
infile 'C:\SAS Study\testdata.txt' missover;
length testcol $20;
input testcol $;
if _n_>2;
run;

3) 生成数据集。
data test2 (drop=i j testcol teststr);
set test end=eof;
array test{5} $1 q1-q5 ;
length teststr $200;
retain teststr;
teststr=trim(left(teststr))||trim(testcol);
if eof then do;
   do i=1 to 8;
      do j=1 to 5;
         test{j}=substr(teststr,j+i*5-5,1);
      end;
      output;
   end;
end;
run;

4) 输出数据。
proc print data=test2;
run;   

Obs q1 q2 q3 q4 q5
1  A  B  C  D  E
2  A  A  C  C  E
3  B  B  B  B  B
4  C  B  B  D  A
5  D  D  A  A  C
6  C  A  B  B  B
7  E  E  B  B  B
8  B  C  A  C  A

5) 说明,这仅仅是考虑所提供的特殊数据情况。如果数据变化,则需要重新考虑。
希望能够抛砖引玉。
已有 1 人评分论坛币 收起 理由
admin + 100 热心帮助其他会员

总评分: 论坛币 + 100   查看全部评分

使用道具

7
shentt3214 发表于 2013-3-2 11:48:58 |只看作者 |坛友微信交流群
bjtoronto 发表于 2013-2-19 07:19
1) 如果是特殊情况,假设原始数据格式如下。建立数据文件TestData.txt
Data for 5 Questions
谢谢

使用道具

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

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

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

GMT+8, 2024-6-17 23:00