我尝试使用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引发了同样的问题,但从那里找不到多少帮助。
答案 0 :(得分:3)
首先,当你实际上没有逗号分隔值时,使用read.csv有点奇怪。 read.table
是更自然的选择。
但主要问题是你没有矩形数据。 read.table
和read.csv
都输出data.frame
,假设每行的列数相同。 R读取文件的前几行,以确定每列的列数和每列的数据类型。因此,如果你的最长线在这个“偷看”区域之后,那么R将不会期望那么多列。如果您确实知道数据的最大列数,则可以将该长度的向量指定为colClasses
。因此,如果最长的行有30个值并且它们都是字符,则可以指定colClasses=rep("character",30)
。
听起来您可能想要考虑其他方式来读取数据并存储它。也许readLines
或scan
可能是更好的选择。您可以将数据保存在list
而不是data.frame
。