write和read.csv列数不同

时间:2016-05-12 06:28:19

标签: r

writeread.csv的一个奇怪问题。我有办法解决这个问题,但如果有人能够确定发生了什么,那就太棒了。

我有来自其他人的代码,它通过追加新行来动态创建一系列CSV。问题是read.csv似乎不一致地读取新创建的csv。

虚拟代码示例:

datfile <- "E:/temp.csv"
write(paste("Name","tempname",sep=","),datfile,1)
write(paste("VShort",50,sep=","),datfile,1,append=T)
write(paste("Short1",1,1,sep=","),datfile,1,append=T)
write(paste("Short2",0,2,sep=","),datfile,1,append=T)
write(paste("Short3",0,2,sep=","),datfile,1,append=T)
write(paste("Long",0,0.3,0.6,1,sep=","),datfile,1,append=T)
write(paste("Short4",2,0,sep=","),datfile,1,append=T)
read.csv(datfile,header=F,colClasses="character")

七行数据写入CSV,但read.csv读取8行(Long分为两行)。读入了8行和3列。

通过在Excel中打开temp.csv并保存来解决此问题。然后read.csv适当地读入7行。

在某些情况下,问题似乎只存在。例如,删除Short 3并且没有问题:

datfile2 <- "E:/temp2.csv"
write(paste("Name","tempname",sep=","),datfile2,1)
write(paste("VShort",50,sep=","),datfile2,1,append=T)
write(paste("Short1",1,1,sep=","),datfile2,1,append=T)
write(paste("Short2",0,2,sep=","),datfile2,1,append=T)
write(paste("Long",0,0.3,0.6,1,sep=","),datfile2,1,append=T)
write(paste("Short4",2,0,sep=","),datfile2,1,append=T)
read.csv(datfile2,header=F,colClasses="character") 

读入六行五列。

这里有什么想法?

R版本3.2.4修订

Windows 10

1 个答案:

答案 0 :(得分:2)

这可能与?read.csv中的以下内容有关:

  

通过查看前五个来确定数据列的数量   输入行(或整个文件,如果它少于五行),或   从col.names的长度开始,如果指定并且更长。这个   如果填充或blank.lines.skip是真的,那么可能是错误的   必要时指定col.names(如'Examples'中所示)。

恰好,列数最多的行是第一个示例中的第六行。

我建议使用col.names来解决这个问题,例如:

`... read.csv(..., col.names = paste0('V', 1:6))`

正如OP在对此答案的评论中所说,你可以找出它的数量 使用readLines所需的列:

Ncol <- max(unlist(lapply(strsplit(readLines(datfile), ","), length)))

然后修改上面的内容给出:

read.csv(datfile,header=F,colClasses="character", col.names=paste0("V", 1:Ncol))