【问题标题】:Read.CSV not working as expected in RRead.CSV 在 R 中无法按预期工作
【发布时间】:2012-08-12 07:20:23
【问题描述】:

我被难住了。通常,read.csv 按预期工作,但我遇到了一个行为出乎意料的问题。这很可能是我的用户错误,但我们将不胜感激。

这是文件的网址

http://nces.ed.gov/ipeds/datacenter/data/SFA0910.zip

这是我获取文件、解压缩并读入的代码:

 URL <- "http://nces.ed.gov/ipeds/datacenter/data/SFA0910.zip"
 download.file(URL, destfile="temp.zip")
 unzip("temp.zip")
 tmp <- read.table("sfa0910.csv", 
                   header=T, stringsAsFactors=F, sep=",", row.names=NULL)

这是我的问题。当我在 Excel 中打开数据 csv 数据时,数据看起来符合预期。当我将数据读入 R 时,第一列实际上命名为 row.names。 R 正在读取一行额外的数据,但我无法弄清楚导致 row.names 成为一列的“错误”发生在哪里。简单地说,它看起来像数据转移了。

然而,奇怪的是,R 中的最后一列似乎包含正确的数据。

以下是前几列中的几行:

tmp[1:5,1:7]
  row.names UNITID XSCUGRAD SCUGRAD XSCUGFFN SCUGFFN XSCUGFFP
1    100654      R     4496       R     1044       R       23
2    100663      R    10646       R     1496       R       14
3    100690      R      380       R        5       R        1
4    100706      R     6119       R      774       R       13
5    100724      R     4638       R     1209       R       26

有什么想法我可能做错了吗?

【问题讨论】:

  • 永远不要假设 Excel 正确地表示了 CSV 文件的内容。改为在文本编辑器中打开 CSV(这不是问题的原因,而是作为一般规则)。
  • 删除 row.names = NULL 参数。
  • @ttmaccer - 这很奇怪,您不需要对网站进行身份验证。我刚从网上试了一下,它自动将文件下载到我的电脑上。我正在使用 Chrome。
  • @mnel - 我也试过了,但没用。奇怪的是,R 中的最后一列数据似乎没问题。我不能只改变列名。
  • 我认为这指向了问题所在,但我在 csv 中找不到有问题的行 dim(read.csv("sfa0910.csv", header = F, skip = 1))6852 452length(unlist(strsplit(readLines('sfa0910.csv',1), ',')))451

标签: r csv read.csv


【解决方案1】:

如果您使用本地数据,还要确保它位于正确的位置。确保将其放在您的工作目录中并通过以下方式更改它 setwd("C:/[User]/[MyFolder]") 直接在您的 R 控制台中。

【讨论】:

    【解决方案2】:

    我知道你找到了答案,但由于你的回答帮助我找到了答案,我将分享:

    如果你读入 R 文件,其中不同行的列数不同,如下所示:

    1,2,3,4,5
    1,2,3,4
    1,2,3
    

    它将用 NA 填充缺失的列,如下所示:

    1,2,3,4,5
    1,2,3,4,NA
    1,2,3,NA,NA
    

    但是! 如果列最大的行不是第一行,像这样:

    1,2,3,4
    1,2,3,4,5
    1,2,3
    

    那么它会以一种有点混乱的方式阅读:

    1,2,3,4
    1,2,3,4
    5,NA,NA,NA
    1,2,3,NA
    

    (在你发现问题之前不知所措,之后非常简单!)

    只是希望它可以帮助某人!

    【讨论】:

    • 我找到的最佳答案!!
    【解决方案3】:

    我有一个可能基于 mnel 的 cmets 的修复

    dat<-readLines(paste("sfa", '0910', ".csv", sep=""))
    ncommas<-sapply(seq_along(dat),function(x){sum(attributes(gregexpr(',',dat[x])[[1]])$match.length)})
    > head(ncommas)
    [1] 450 451 451 451 451 451
    

    第一列之后的所有列都有一个额外的分隔符,excel会忽略。

    for(i in seq_along(dat)[-1]){
    dat[i]<-gsub('(.*),','\\1',dat[i])
    }
    write(dat,'temp.csv')
    
    tmp<-read.table('temp.csv',header=T, stringsAsFactors=F, sep=",")
    
    > tmp[1:5,1:7]
      UNITID XSCUGRAD SCUGRAD XSCUGFFN SCUGFFN XSCUGFFP SCUGFFP
    1 100654        R    4496        R    1044        R      23
    2 100663        R   10646        R    1496        R      14
    3 100690        R     380        R       5        R       1
    4 100706        R    6119        R     774        R      13
    5 100724        R    4638        R    1209        R      26
    

    故事的寓意....听 Joshua Ulrich ;)

    快速修复。在excel中打开文件并保存。这也会删除多余的分隔符。

    或者

    dat<-readLines(paste("sfa", '0910', ".csv", sep=""),n=1)
    dum.names<-unlist(strsplit(dat,','))
    tmp <- read.table(paste("sfa", '0910', ".csv", sep=""), 
                       header=F, stringsAsFactors=F,col.names=c(dum.names,'XXXX'),sep=",",skip=1)
    tmp1<-tmp[,-dim(tmp)[2]]
    

    【讨论】:

    • 好电话!这也是我的确切问题
    【解决方案4】:

    我的提示:使用 count.fields() 作为分隔文件未按预期运行时的快速诊断。

    首先,使用table()统计字段数:

    table(count.fields("sfa0910.csv", sep = ","))
    # 451  452 
    #   1 6852
    

    这告诉您,除了一行之外,所有行都包含 452 个字段。那么哪条是异常线呢?

    which(count.fields("sfa0910.csv", sep = ",") != 452)
    # [1] 1
    

    第一行是问题所在。检查时,除第一行之外的所有行都以 2 个逗号结尾。

    现在的问题是:这是什么意思?标题行中是否应该有一个额外的字段被省略?还是附加到其他行的 2 个逗号有误?如果可能,最好联系生成数据的人,以澄清歧义。

    【讨论】:

    • +1 用于突出显示count.fields。从外观上看,这是一种很好的处理功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2014-12-09
    • 2016-01-13
    • 2020-09-21
    相关资源
    最近更新 更多