【问题标题】:write and read.csv different number of columnswrite 和 read.csv 不同的列数
【发布时间】:2016-09-07 19:31:05
【问题描述】:

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")

7 行数据写入 CSV,但read.csv 读取 8 行(Long 分为两行)。八行三列读入。

通过在 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

【问题讨论】:

    标签: r


    【解决方案1】:

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

    数据列的数量是通过查看前五个来确定的 输入行(如果文件少于五行,则为整个文件),或 从 col.names 的长度(如果它被指定并且更长)。这 如果 fill 或 blank.lines.skip 为真,可能是错误的,所以 如有必要,请指定 col.names(如“示例”中所示)。

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

    我建议使用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))
    

    【讨论】:

    • 啊,谢谢。再次表明仔细阅读帮助材料可以回答问题。我会试试 col.names,但列数不是固定的,所以可能不是直截了当的。
    • 我最终使用了:Ncol &lt;- max(unlist(lapply(strsplit(readLines(datfile), ","), length)))read.csv(datfile,header=F,colClasses="character", col.names=paste0("V", 1:Ncol))。我发现this solution 也很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2015-07-07
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2018-08-13
    • 2011-12-04
    相关资源
    最近更新 更多