【问题标题】:R read.csv "More columns than column names" errorR read.csv“列多于列名”错误
【发布时间】:2014-11-04 10:27:50
【问题描述】:

.csv 文件导入 R 时遇到问题。使用我的代码:

t <- read.csv("C:\\N0_07312014.CSV", na.string=c("","null","NaN","X"),
          header=T, stringsAsFactors=FALSE,check.names=F)

R报错,不做我想做的事:

Error in read.table(file = file, header = header, sep = sep, quote = quote,  : 
  more columns than column names

我想问题是因为我的数据格式不正确。我只需要来自[,1:32] 的数据。所有其他的都应该删除。

数据可以从以下位置下载: https://drive.google.com/file/d/0B86_a8ltyoL3VXJYM3NVdmNPMUU/edit?usp=sharing

非常感谢!

【问题讨论】:

  • 您不能仅通过更改文件扩展名将 HTML 文件的结构更改为 CSV 格式的文件。
  • 这是一个 CSV 文件。一个不稳定的,有 10 个标题散布在整个过程中,但它是一个 CSV 文件。

标签: r import


【解决方案1】:

如果您只需要前 32 列,并且知道有多少列,则可以将其他列类设置为 NULL。

read.csv("C:\\N0_07312014.CSV", na.string=c("","null","NaN","X"),
      header=T, stringsAsFactors=FALSE,
      colClasses=c(rep("character",32),rep("NULL",10)))

如果您不想对每个 colClass 进行编码并且喜欢猜测 read.csv,那么只需保存该 csv 并再次打开它。

或者,您可以跳过标题并自己命名列并删除行为不端的行。

A<-data.frame(read.csv("N0_07312014.CSV",
                        header=F,stringsAsFactors=FALSE,
                        colClasses=c(rep("character",32),rep("NULL",5)),
                        na.string=c("","null","NaN","X")))
Yournames<-as.character(A[1,])
names(A)<-Yournames
yourdata<-unique(A)[-1,]

上面的代码假设您不想要任何重复的行。您也可以删除第一个条目与第一个列名称相同的行,但我将把它留给您。

【讨论】:

  • 应该是colClasses=,而且 CSV 文件真的很不稳定。该特定方法不会为该数据生成可行的数据框。
  • 可以跳过标题行吗?
  • 问题是不只是一个标题行,整个文件有10个穿插
  • 然后删除它们。大概你不想要任何重复。您可以使用unique 删除重复项。
  • 这不是我的数据,这就是我的代码所做的。在您的最后一次修订中,发布者可以在删除所有 NA 列后使用这些数据。
【解决方案2】:

这是一个不稳定的 CSV 文件。折腾了多个标题(尝试将其粘贴到CSV Fingerprint)以了解我的意思。

由于我不知道数据,因此无法确定以下为您生成准确的结果,但它涉及使用readLines 和其他 R 函数对文本进行预处理:

# use readLines to get the data
dat <- readLines("N0_07312014.CSV")

# i had to do this to fix grep errors
Sys.setlocale('LC_ALL','C')

# filter out the repeating, and wonky headers
dat_2 <- grep("Node Name,RTC_date", dat, invert=TRUE, value=TRUE)

# turn that vector into a text connection for read.csv
dat_3 <- read.csv(textConnection(paste0(dat_2, collapse="\n")),
                  header=FALSE, stringsAsFactors=FALSE)

str(dat_3)
## 'data.frame':    308 obs. of  37 variables:
##  $ V1 : chr  "Node 0" "Node 0" "Node 0" "Node 0" ...
##  $ V2 : chr  "07/31/2014" "07/31/2014" "07/31/2014" "07/31/2014" ...
##  $ V3 : chr  "08:58:18" "08:59:22" "08:59:37" "09:00:06" ...
##  $ V4 : chr  "" "" "" "" ...
## .. more
##  $ V36: chr  "" "" "" "" ...
##  $ V37: chr  "0" "0" "0" "0" ...

# grab the headers
headers <- strsplit(dat[1], ",")[[1]]

# how many of them are there?
length(headers)
## [1] 32

# limit it to the 32 columns you want (Which matches)
dat_4 <- dat_3[,1:32]

# and add the headers
colnames(dat_4) <- headers

str(dat_4)
## 'data.frame':    308 obs. of  32 variables:
##  $ Node Name         : chr  "Node 0" "Node 0" "Node 0" "Node 0" ...
##  $ RTC_date          : chr  "07/31/2014" "07/31/2014" "07/31/2014" "07/31/2014" ...
##  $ RTC_time          : chr  "08:58:18" "08:59:22" "08:59:37" "09:00:06" ...
##  $ N1 Bat (VDC)      : chr  "" "" "" "" ...
##  $ N1 Shinyei (ug/m3): chr  "" "" "0.23" "null" ...
##  $ N1 CC (ppb)       : chr  "" "" "null" "null" ...
##  $ N1 Aeroq (ppm)    : chr  "" "" "null" "null" ...
## ... continues

【讨论】:

  • readlines + grep 过滤是个好主意。我会给你一个 +1。
【解决方案3】:

将 .csv 作为文本文件打开(例如,在 Mac 上使用 TextEdit)并检查列是否用逗号分隔。

csv 是“逗号分隔的向量”。出于某种原因,当 Excel 保存我的 csv 时,它使用分号代替。

打开 csv 时使用:

read.csv("file_name.csv",sep=";")

分号只是一个例子,但正如其他人之前建议的那样,不要假设因为您的 csv 在 Excel 中看起来不错,所以它就是这样。

【讨论】:

    【解决方案4】:

    尝试使用 read.table() 而不是 read.csv()

    【讨论】:

    • 这比其他的要好,但是如何处理表中的空值呢?
    • 我不确定你是不是这个意思:df [is.na(df)]
    【解决方案5】:

    我也面临同样的问题。现在解决了。

    只需使用header = FALSE

    read.csv("data.csv", header = FALSE) -> mydata
    

    【讨论】:

      【解决方案6】:

      我遇到了同样的问题。我在文本文件中打开了我的数据,双表达式用分号分隔,你应该用句号替换它们

      【讨论】:

        【解决方案7】:

        这个错误是由文件顶部的多行元数据引起的。我可以通过执行 skip= 并跳过这些行来使用 read.csv。

        data &lt;- read.csv('/blah.csv',skip=3)

        【讨论】:

          【解决方案8】:

          对我来说,解决方案是使用 csv2 而不是 csv。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-08-13
            • 2021-10-18
            • 1970-01-01
            • 1970-01-01
            • 2019-07-03
            • 1970-01-01
            • 2020-07-02
            相关资源
            最近更新 更多