【问题标题】:Why read.csv breaks lines longer than the first line into multiple rows?为什么 read.csv 将比第一行更长的行分成多行?
【发布时间】:2014-05-27 01:59:33
【问题描述】:

我尝试使用 read.csv 在 R 中读取以下文件,在我看来,只要文件的第一行不包含最大数量的列,read.csv 就会错误地读取它。具体来说,当我将“CCW12 ERV14 PER1 PTK2 RPN4 SEC66 SKY1 SUR4 VPS51 VPS52 VPS53 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 提出了同样的问题,但从那里找不到太多帮助。

【问题讨论】:

    标签: r csv


    【解决方案1】:

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

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

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

    【讨论】:

    • read.table 不起作用:它说第 x 行没有 y 元素
    • @user2426277 好吧,read.csv 恰好默认设置了fill=T。但这并不意味着它是正确的。 read.table 告诉你真正的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2013-03-29
    • 2019-04-28
    相关资源
    最近更新 更多