2016-05-31 10 views
-2

Die Daten sind schrecklich formatiert, aber ich kann nichts mit der Quelle tun. Ich versuche, es besser zu sortieren/zu formatieren, damit ich die Daten analysieren kann.Sortieren von Datenrahmen mit mehreren Datumsspalten

Es gibt mehrere Datumsspalten, die mit unterschiedlichen Anfangsdaten in meinem Dataset beginnen. Hier ein Beispiel:

DF <- data.frame(V1 = c('FS', 'Date', '1/31/2000','2/29/2000','',''), 
       V1.1 = c('','','99.87','99.97','',''), 
       V10 = c('FIIB','Date','10/29/2004','10/30/2004','12/31/2004','1/31/2005'), 
       V10.1 = c('','','103.24','104.82','105.14','107.68')) 

Es sieht aus wie unten, aber mit Hunderten von mehreren Spalten:

  V1 V1.1  V10 V10.1 
1  FS    FIIB  
2  Date    Date  
3 1/31/2000 99.87 10/29/2004 103.24 
4 2/29/2000 99.97 11/30/2004 104.82 
5     12/31/2004 105.14 
6     1/31/2005 107.68 

Der Beginn Datum festgelegt ist, die 2000.01.31 ist, und das Enddatum ist die Ende des Vormonats, in diesem Fall 30.04.2016. Das Enddatum wird von Monat zu Monat aktualisiert. Wenn eine Sicherheit in bestimmten Monaten keine Rückgaben aufweist, verwenden Sie leer oder NA. Da FS zum Beispiel nur die Preise am 31. Januar und am 29. Februar 2000 hat, wird der Rest (vom 31. März 2000 bis zum 30. April 2016) Leerstellen oder NAs sein. Mit diesem wird gesagt, sollten die Daten wie folgt aussehen:

V1   V2  V3  V4 
Date  FS  FIIB ...  
1/31/2000 99.87 NA  ... 
2/29/2000 99.97 NA  ... 
...  ... ... ... 
10/29/2004 NA  103.24 ... 
11/30/2004 NA  104.82 ... 
12/31/2004 NA  105.14 ... 
1/31/2005 NA  107.68 ... 
...  ... ... ... 
4/30/2016 ... ... ... 

Ich weiß, wie order zu verwenden, um die Daten auf einer bestimmten Spalte zu sortieren. Aber mit mehreren Daten brauche ich Hilfe. Vielen Dank!

+0

den 'FS' ist,' FIIB' und "Date" -Werte sollen variable Namen sein? Was ist die Logik dahinter, wie sie sich zwischen Ihrem Beispiel und der gewünschten Ausgabe bewegen? – effel

+0

Was möchten Sie eigentlich tun? "sauber und organisieren meine Datenmenge" ist ziemlich vage ... – nsheff

+0

Ja, "FS" und "FIIB" sind die Variablen (Sicherheit) Namen. Wie Sie sehen können, hat jedes Wertpapier die monatlichen Daten darunter und den monatlichen Preis in der nächsten Spalte. Das Problem ist, dass die Anfangsdaten zwischen Wertpapieren unterschiedlich sind. Zum Beispiel hat "FS" Preisdaten am 31. Januar und 29. Februar 2000, während "FIIB" Daten vom 29.10.2004 bis 30.4.2016 hat. Ich möchte eine Spalte "Datum" erstellen und die monatlichen Daten entsprechend anpassen. –

Antwort

2

Sie könnten diese ziemlich schlecht formatierte Daten-Set aufzuräumen wie folgt:

# convert the columns to character values 
# this is only needed if they are stored as factor variables 
# alternatively you can read the dataframe with 'stringsAsFactors = FALSE' 
DF[] <- lapply(DF, as.character) 
# replace the empty spots with NA's 
DF[DF==''] <- NA 

# extract the first two columns into a new dataframe 
DF1 <- DF[complete.cases(DF[,1:2]), 1:2] 
# assign the correct names 
names(DF1) <- c(DF[2,1],DF[1,1]) 

# extract the next two columns into a new dataframe 
DF2 <- DF[complete.cases(DF[,3:4]), 3:4] 
# assign the correct names 
names(DF2) <- c(DF[2,3],DF[1,3]) 

# merge them into a new dataframe 
DFnew <- merge(DF1, DF2, by = 'Date', all = TRUE) 

die gibt:

> DFnew 
     Date FS FIIB 
1 1/31/2000 99.87 <NA> 
2 2/29/2000 99.97 <NA> 
3 10/29/2004 <NA> 103.24 
4 10/30/2004 <NA> 104.82 
5 12/31/2004 <NA> 105.14 
6 1/31/2005 <NA> 107.68 

Wenn Sie viele Spalten organisiert die gleiche Art und Weise in der ursprünglichen Datenrahmen, ist es ziemlich umständlich, alle Kombinationen zu tippen. Für diesen Fall können Sie die falsch formatierte Datenrahmen wie folgt (die Umstellung auf Charakterwerte und der Ersatz von leeren Stelle bleibt gleich) verarbeiten:

> DFnew 
     Date FS FIIB 
1 1/31/2000 99.87 <NA> 
2 1/31/2005 <NA> 107.68 
3 10/29/2004 <NA> 103.24 
4 10/30/2004 <NA> 104.82 
5 12/31/2004 <NA> 105.14 
6 2/29/2000 99.97 <NA> 

Wie Sie sehen können:

# split the badly formatted dataframe into a list of dataframes 
lst1 <- lapply(seq(2,ncol(DF),2), function(i) DF[complete.cases(DF[,(i-1):i]), (i-1):i]) 

# set the names for each dataframe in the list 
lst2 <- lapply(seq(lst1), function(x) {names(lst1[[x]]) <- c(DF[2,(x*2-1)],DF[1,(x*2-1)]); return(lst1[[x]])}) 

# merge the list of dataframes back into one new dataframe 
DFnew <- Reduce(function(...) merge(..., by = 'Date', all = TRUE), lst2) 

die gibt , dies ergibt das gleiche Ergebnis (wenn auch in anderer Reihenfolge). Bei diesem Ansatz wird davon ausgegangen, dass der Rest Ihres schlecht formatierten Datenrahmens die gleiche Struktur wie der Beispieldatenrahmen aufweist.


Schließlich, um alles in den richtigen Klassen zu erhalten und den neuen Datenrahmen bestellt nach Date:

# set column classes 
DFnew[] <- lapply(DFnew, type.convert) 
# change the 'Date'-column to date-format 
DFnew$Date <- as.Date(DFnew$Date, format = '%m/%d/%Y') 
# set the order 
DFnew <- DFnew[order(DFnew$Date),] 

die gibt:

> DFnew 
     Date FS FIIB 
1 2000-01-31 99.87  NA 
6 2000-02-29 99.97  NA 
3 2004-10-29 NA 103.24 
4 2004-10-30 NA 104.82 
5 2004-12-31 NA 105.14 
2 2005-01-31 NA 107.68 
+0

Ja, das Datenformat ist schrecklich und ich kann nichts mit der Quelle machen. Deshalb suche ich nach einer Möglichkeit, die Ergebnisse besser zu formatieren. Danke für deine Beratung. –

+0

Ich habe gerade an meinem Datensatz experimentiert. Ich habe mehr als 100 Spalten ähnlich. Gibt es eine bessere Möglichkeit, die Spalten zu extrahieren anstatt 1: 2, 3: 4 usw. zu verwenden? Vielen Dank! –

+0

@ T-T Siehe das Update, HTH. – Jaap

Verwandte Themen