为什么read.csv会将比第一行更长的行分成多行?

时间:2014-05-27 01:59:34

标签: r csv

我尝试使用read.csv在R中读取以下文件,在我看来,只要文件的第一行不包含最大数量的列,read.csv就会错误地读取它。具体来说,当我将记录“CCW12 ERV14 PER1 PTK2 RPN4 SEC66 SKY1 SUR4 VPS51 VPS52 VPS53 VPS54 VPS54 VTC4”放在我文件的第一行时,read.csv会将文件正确读入7行表格。

我的档案:

CCW12 ERV14 PER1 PTK2 RPN4 SEC66 SKY1 SUR4 VPS51 VPS52 VPS53 VPS54 VTC4
ERV14 HLJ1 ILM1 KRE1 PER1
BST1 ERV14 ERV25 HLJ1 KIN3 KRE1 LAS21 PER1 VPS38
ANP1 CWH43 ERV14 HLJ1 LAS21 PER1 SUR4 VPS51
CCW12 ERD1 ERV14 OST3 PER1 PMT2 SUM1 SUR4 TED1
ERV14 PER1 SEC66 SSH1 SUR4 VPS51
CCW12 PER1 PMT2 RPN4 SKY1 SUR4 TED1


y=read.csv("./file.txt", sep=" ", header=FALSE)
y
     V1    V2    V3   V4    V5    V6    V7    V8    V9   V10   V11   V12  V13
1 CCW12 ERV14  PER1 PTK2  RPN4 SEC66  SKY1  SUR4 VPS51 VPS52 VPS53 VPS54 VTC4
2 ERV14  HLJ1  ILM1 KRE1  PER1                                               
3  BST1 ERV14 ERV25 HLJ1  KIN3  KRE1 LAS21  PER1 VPS38                       
4  ANP1 CWH43 ERV14 HLJ1 LAS21  PER1  SUR4 VPS51                             
5 CCW12  ERD1 ERV14 OST3  PER1  PMT2  SUM1  SUR4  TED1                       
6 ERV14  PER1 SEC66 SSH1  SUR4 VPS51                                         
7 CCW12  PER1  PMT2 RPN4  SKY1  SUR4  TED1

但是当我将该记录放在其他地方时,read.csv会将记录分为两行,其中一行包含{CCW12 ERV14 PER1 PTK2 RPN4 SEC66 SKY1 SUR4 VPS51}项,另一行包含{VPS52 VPS53 VPS54 VTC4}

我将第一行移到另一个地方后的文件:

ERV14 HLJ1 ILM1 KRE1 PER1
BST1 ERV14 ERV25 HLJ1 KIN3 KRE1 LAS21 PER1 VPS38
ANP1 CWH43 ERV14 HLJ1 LAS21 PER1 SUR4 VPS51
CCW12 ERD1 ERV14 OST3 PER1 PMT2 SUM1 SUR4 TED1
ERV14 PER1 SEC66 SSH1 SUR4 VPS51
CCW12 ERV14 PER1 PTK2 RPN4 SEC66 SKY1 SUR4 VPS51 VPS52 VPS53 VPS54 VTC4
CCW12 PER1 PMT2 RPN4 SKY1 SUR4 TED1

y=read.csv("./file.txt", sep=" ", header=FALSE)
y
     V1    V2    V3   V4    V5    V6    V7    V8    V9
1 ERV14  HLJ1  ILM1 KRE1  PER1  
2  BST1 ERV14 ERV25 HLJ1  KIN3  KRE1 LAS21  PER1 VPS38
3  ANP1 CWH43 ERV14 HLJ1 LAS21  PER1  SUR4 VPS51      
4 CCW12  ERD1 ERV14 OST3  PER1  PMT2  SUM1  SUR4  TED1
5 ERV14  PER1 SEC66 SSH1  SUR4 VPS51                  
6 CCW12 ERV14  PER1 PTK2  RPN4 SEC66  SKY1  SUR4 VPS51
7 VPS52 VPS53 VPS54 VTC4                              
8 CCW12  PER1  PMT2 RPN4  SKY1  SUR4  TED1

我已经用vim检查过我的文件中没有隐藏/有线字符,而不是记录/行中两个项目之间的空格和行尾的行尾字符。我做错了什么或是R问题?

我看到一个post引发了同样的问题,但从那里找不到多少帮助。

1 个答案:

答案 0 :(得分:3)

首先,当你实际上没有逗号分隔值时,使用read.csv有点奇怪。 read.table是更自然的选择。

但主要问题是你没有矩形数据。 read.tableread.csv都输出data.frame,假设每行的列数相同。 R读取文件的前几行,以确定每列的列数和每列的数据类型。因此,如果你的最长线在这个“偷看”区域之后,那么R将不会期望那么多列。如果您确实知道数据的最大列数,则可以将该长度的向量指定为colClasses。因此,如果最长的行有30个值并且它们都是字符,则可以指定colClasses=rep("character",30)

听起来您可能想要考虑其他方式来读取数据并存储它。也许readLinesscan可能是更好的选择。您可以将数据保存在list而不是data.frame