【问题标题】:When using read.csv, why is entire row converted to <NA> is first value in row is <NA>使用 read.csv 时,为什么整行转换为 <NA> 是行中的第一个值是 <NA>
【发布时间】:2013-12-15 05:55:58
【问题描述】:

我已使用以下read.csv 命令读取仅包含 1,540 行数据的 csv 数据文件。出于某种原因,如果一行中的第一个字段为空,则整行将返回为 NA,如下所示。

data =  read.csv(full_path, header = TRUE, sep = ",", strip.white = TRUE, 
                     fill = TRUE, na.strings = c('NA','','NULL','#N/A'), 
                     row.names = NULL, blank.lines.skip = TRUE)

该文件包含 5 个有用的字段,然后是我删除的 365 个字段。该文件的示例如下所示:

id,conm,No Data,Ticker,Cusip,,,,,,,,,,,
001010-01,ACF INDUSTRIES HOLDING CORP,TRUE,,00099V004^,,,,,,,,,,,
001040-01,AMF INC,TRUE,AMF,001688100^,,,,,,,,,,,
.
.
002444-01,BRUNSWICK CORP,TRUE,BC,117043109^,,,,,,,,,,,
,BURLINGTON INDUSTRIES INC,TRUE,121693972,121693972^,,,,,,,,,,,
002490-01,BURLINGTON NORTHERN INC.,TRUE,BNI,12189T104^,,,,,,,,,,,

因此,在上述 CSV 示例中,公司“BURLINGTON INDUSTRIES INC”的数据丢失,因为 id 为空。

 id                                     conm ticker     cusip 
2 001010-01              ACF INDUSTRIES HOLDING CORP   <NA> 00099V004   
3 001040-01                                  AMF INC    AMF 001688100   
4 001045-01                              AMR CORP/DE  AAMRQ 001765106   
.
.
80   002444-01                                BRUNSWICK CORP     BC 117043109   
NA        <NA>                                          <NA>   <NA>      <NA> 
82   002490-01                      BURLINGTON NORTHERN INC.    BNI 12189T104 

我没有发现这种行为记录在案,但这应该发生吗?还有其他字段为空,但不会发生此行为。我第一次尝试没有'row.names = NULL''blank.lines.skip = TRUE',效果是一样的。

如果我从文件中删除尾随的 365 字段,则读取将按预期工作。我检查了行尾的字段数,每个字段都包含相同的数字。

感谢您的帮助。

** 更新 **

我犯了一个错误,错误不在 read.csv 中,而是在下面的答案中概述的代码行中。

【问题讨论】:

  • 当我复制您的示例数据并将其粘贴/保存到 Windows 中的文本文件时,read.csv(...) 有效(输入 5 行,所有 Burlington 数据都存在)。所以我倾向于认为问题与你的 csv 文件有关。你是如何产生它的?您能否提供该文件的链接,或者至少提供前 85 行左右的链接?我从 Google 文档下载的文件遇到了类似的问题。
  • @jlhoward 是的,你是对的,问题出在下一行代码上。我以为我在阅读后立即检查了状态,但我没有。我正在对 NA 值使用逻辑检查来删除一行。感谢您的帮助。

标签: r csv import


【解决方案1】:

事实证明,read.csv 上没有发生错误,但是当我尝试根据 id 字段中的值删除行时。

data <- data[!data$id == 'Delete-Row',]

如果data$idNULL,则返回一行NULL

【讨论】:

  • NA 值在大多数情况下不会被评估为逻辑语句。在某一时刻,您尝试NA == "Delete-Row,它等于NA,因此整行变为NA。你的问题是什么?您可能需要使用以下逻辑语句:data$id != "Delete-Row" | !is.na(data$conm)
  • @Xachriel 是的,这正是问题所在。正如你所建议的,我刚刚添加了一个新条件,包括 'NA' 案例: data
猜你喜欢
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多