7

我难住了。通常,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

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

4

4 回答 4

17

我的提示:当分隔文件未按预期运行时,使用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 个逗号有误?如果可能,最好联系生成数据的人,以澄清歧义。

于 2012-08-16T02:08:57.380 回答
5

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

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]]
于 2012-08-16T01:32:24.387 回答
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

(在你弄清楚问题之前压倒一切,之后就很简单了!)

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

于 2017-04-16T17:57:52.437 回答
-1

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

于 2021-06-28T14:26:16.893 回答