2012-08-15 8 views
7

beklendiği gibi çalışmıyor. Normal olarak, read.csv beklendiği gibi çalışır, ancak davranış beklenmeyen bir sorunla karşılaştım. Muhtemelen benim için kullanıcı hatasıdır, ancak herhangi bir yardım takdir edilecektir.Read.CSV R

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) 

İşte benim problem: Burada

dosyası

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

URL'si Burada, dosyayı almak halletmek ve bunu okumak benim koddur. Excel'de veri csv verilerini açtığımda, veriler beklendiği gibi görünür. Verileri R'ye okuduğumda, ilk sütun aslında row.names olarak adlandırılır. R, fazladan bir veri satırı okuyor, ancak "error" ifadesinin nerede meydana geldiğini anlayamıyorum, bu da row.names'in bir sütun olmasına neden oluyor. Basitçe, veriler değişti gibi görünüyor. Ancak, garip olan şu ki, R'deki son sütunun uygun verileri içerdiği görülüyor. Yanlış yapıyor olabilir ne

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 

Herhangi düşünceler: Burada

ilk birkaç sütunlarından bir kaç satır vardır?

+4

Excel'in, CSV dosyanızın içeriğini doğru şekilde temsil ettiğini varsaymayın. CSV'yi bunun yerine bir metin düzenleyicide açın (sorununuzun nedeni bu değil, genel bir kural olarak). –

+0

'row.names = NULL' argümanını kaldırın. – mnel

+0

@ttmaccer - bu garip, siteye kimlik doğrulaması yapmanıza gerek yok. Sadece web'den denedim ve dosyayı bilgisayarıma otomatik olarak indirdim. Chrome kullanıyorum. – Btibert3

cevap

5

Ben bir düzeltme belki

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 

tüm sütunlar ilk göz ardı eder excel ekstra seperatör aldıktan sonra mnel yorumlarına bakarak var.)

Hızlı düzeltme;

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 

Hikayenin özü .... Joshua Ulrich dinle. Dosyayı Excel'de açın ve kaydedin. Bu, ekstra ayırıcıları da siler.

Alternatif

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]] 
+0

İyi çağrı! Bu benim sayımı 'count.fields' vurgulamak için de – ZnArK

17

Benim ipucu: count.fields() beklendiği gibi ayrılmış dosyaları davranmazlar zaman hızlı tanı olarak kullanın.

Öncelikle)tablo (kullanarak alanların sayısını saymak: hatlarının biri hariç tüm 452 alanları içeren söyleyen

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

. Yani anormal çizgi nedir?

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

Sorun ilk satırdır. İnceleme sırasında, ilk hariç tüm satırlar 2 virgülle sonlandırılır.

Şimdi soru şu: Bu ne anlama geliyor? Başlık satırında atlanan fazladan bir alan olması gerekiyor mu? Ya da diğer satırlara eklenen 2 virgül hata mıydı? Belirsizliği açıklığa kavuşturmak için mümkünse verileri oluşturan kişi ile iletişime geçmek en iyisi olabilir.

+1

+1 oldu. Bu çeşit işleme için güzel bir işlev. – thelatemail

0

Ben bir cevap buldum ama cevap bu öğrenmek için bana yardımcı oldu, ben paylaşacağız biliyorum:

Eğer R içine bu gibi farklı satırlar için sütunların farklı miktarda içeren bir dosya okursanız :

salt içinde olacağını
1,2,3,4,5 
1,2,3,4 
1,2,3 

böyle, UA ile eksik sütunları doldurma:

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

AMA! büyük sütunlu satır böyle ilk satır, değilse:

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

biraz kafa karıştırıcı şekilde okunması yerinde olacaktır:

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

(ezici sen anlamaya önce sorun ve sonra oldukça basit!)

Sadece birilerine yardımcı olabilir umuyoruz!