R读取.csv“列多于列名”错误

erhoui1w  于 2022-12-24  发布在  其他
关注(0)|答案(9)|浏览(265)

我有一个问题,当导入.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
非常感谢!

rlcwz9us

rlcwz9us1#

将.csv文件作为文本文件打开(例如,在Mac上使用TextEdit),然后检查各列是否用逗号分隔。
csv是“逗号分隔的向量”。由于某种原因,当Excel保存我的csv时,它使用分号代替。
打开csv时,请用途:

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

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

pn9klfpd

pn9klfpd2#

这是一个不稳定的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
dldeef67

dldeef673#

如果您只需要前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,]

上面的代码假设您不希望有任何重复的行,您也可以删除第一个条目等于第一个列名的行,但我将把这个留给您。

5vf7fwbs

5vf7fwbs4#

尝试读取.table()而不是读取.csv()

wlp8pajw

wlp8pajw5#

我也面临着同样的问题。现在解决了。
只需使用header = FALSE

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

zkure5ic6#

我也遇到了同样的问题。我在textfile中打开了我的数据,双精度表达式是用分号分隔的,你应该用句点替换它们

tvmytwxo

tvmytwxo7#

我遇到了这个错误,这是由文件顶部的多行 meta数据引起的。我可以通过执行skip=并跳过这些行来使用read.csv。
第一个月

flvtvl50

flvtvl508#

对我来说,解决办法是使用csv2而不是csv。

0ejtzxu1

0ejtzxu19#

read.csv("file_name.csv", header=F)

将HEADER设置为FALSE将非常适合您...

相关问题