2017-11-06 1 views
0

Ich versuche, in einer CSV-Datei zu lesen, und ich bin in den folgenden Fehler läuft.Importieren von CSV aus einem angegebenen Wertebereich

Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : 
    line 1097 did not have 5 elements 

Nach einer weiteren Überprüfung der CSV-Datei finde ich, dass um die Linie 1097 gibt es eine Pause in den Reihen ist und startet einen neuen Header mit Jahresdaten (Ich interessiere mich für monatlich für jetzt).

Der obige Code lädt die ZIP-Datei herunter und importiert die CSV-Datei für die ersten 100 Zeilen in R, was perfekt funktioniert. Aber die ersten 100 Zeilen (zur Veranschaulichung) sind Datenpunkte aus den 1920er und 1930er Jahren, was mich nicht besonders interessiert.

Meine Frage ist, wie kann ich Daten von einem Wert in die importieren erste komma-getrennte CSV-Datei, zB 192607 (1926-07) bis 195007 (1950-07) -Ich kann die neuesten Werte importieren, indem ich nrow = 1095 ändere, aber das ist nicht das, was ich gerade versuche zu erreichen.

Momentaufnahme der Daten;

,Mkt-RF,SMB,HML,RF 
192607, 2.96, -2.30, -2.87, 0.22 
192608, 2.64, -1.40, 4.19, 0.25 
192609, 0.36, -1.32, 0.01, 0.23 

... Line 1100

Annual Factors: January-December 
,Mkt-RF,SMB,HML,RF 
    1927, 29.47, -2.46, -3.75, 3.12 
    1928, 35.39, 4.20, -6.15, 3.56 
+0

Sie können 'scan' verwenden, um die Daten zu untersuchen und die Zeilen zu finden, die Sie lesen möchten, z. B. 1926-1950. – CCurtis

Antwort

1

Die erste Tabelle in der Datei zwischen den ersten beide Null-Länge Leitungen, so würde dies ohne die Junk-liest vor und nach und Teilmenge dann an den angegebenen Tagen:

# read first table in file 
Lines <- readLines("F-F_Research_Data_Factors.CSV") 
ix <- which(Lines == "") 
DF0 <- read.csv(text = Lines[ix[1]:ix[2]]) # all rows in first table 

# subset it to indicated dates 
DF <- subset(DF0, X >= 192607 & X <= 195007) 

Hinweis: Wenn wir alle Tabellen haben wollen, beginnen Zeilen, die mit einem Komma beginnen, jede Tabelle und leere Zeilen beenden sie (außer die erste leere Zeile kommt vor den Tabellen), also Lines von oben, ergibt dies eine Liste L, deren i-te Komponente die i-te Tabelle ist die Datei.

st <- grep("^,", Lines) # starting line numbers 
en <- which(Lines == "")[-1] # ending line numbers 
L <- Map(function(st, en) read.csv(text = Lines[st:en]), st, en) 
+0

Arbeitete genau so, wie ich hoffte, danke! – user113156

2

benutzte ich read.csv statt read.table

French <- read.csv("F-F_Research_Data_Factors.CSV", sep = ",", skip = 3, 
header = T) 

und 1188 Beobachtungen erhalten. Ich denke, dass Sie Ihren Datensatz von hier aus unterteilen können.

+0

Danke, dass scheint den Trick zu tun – user113156

+0

@ user113156 Glücklich zu helfen :) – Davidx