2017-06-08 3 views
0

Ich versuche, einige Daten zu bereinigen, die ich aus dem Internet heruntergeladen habe und in XTS konvertiert habe. Ich habe eine Dokumentation über CRAN gefunden, die GREPL verwendet, um die Daten zu bereinigen, aber ich frage mich, ob es einen einfacheren Weg gibt, dies zu tun, als mit GREPL. Ich hatte gehofft, jemand könnte mir mit dem Code helfen, diese Daten entweder mit GREPL oder einer anderen Funktion in R zu bereinigen. Vielen Dank im Voraus für jede Hilfe, die Sie mir zur Verfügung stellen können.Beste Art, Daten in R zu reinigen und zu XTS zu konvertieren

[1] "{"                     
    [2] " \"Meta Data\": {"                
    [3] "  \"1. Information\": \"Daily Prices (open, high, low, close) and Volumes\"," 
    [4] "  \"2. Symbol\": \"MSFT\","             
    [5] "  \"3. Last Refreshed\": \"2017-06-08 15:15:00\","       
    [6] "  \"4. Output Size\": \"Compact\","           
    [7] "  \"5. Time Zone\": \"US/Eastern\""  
    [8] "  },"                   
    [9] "  \"2017-01-19\": {"               
[10] "   \"1. open\": \"62.2400\","            
[11] "   \"2. high\": \"62.9800\","            
[12] "   \"3. low\": \"62.1950\","            
[13] "   \"4. close\": \"62.3000\","            
[14] "   \"5. volume\": \"18451655\""           
[15] "  },"                   
[16] "  \"2017-01-18\": {"               
[17] "   \"1. open\": \"62.6700\","            
[18] "   \"2. high\": \"62.7000\","            
[19] "   \"3. low\": \"62.1200\","            
[20] "   \"4. close\": \"62.5000\","            
[21] "   \"5. volume\": \"19670102\""           
[22] "  },"                   
[23] "  \"2017-01-17\": {"               
[24] "   \"1. open\": \"62.6800\","            
[25] "   \"2. high\": \"62.7000\","            
[26] "   \"3. low\": \"62.0300\","            
[27] "   \"4. close\": \"62.5300\","            
[28] "   \"5. volume\": \"20663983\""           
[29] "  }"                   
[30] " }"                    
[31] "}"         

würde die endgültige Ausgabe für diese Daten wie folgt aussehen:

  Open  High  Low  Close  Volume 
2017-01-17 62.68  62.70  62.03  62.53  20663983 
2017-01-18 62.67  62.70  62.12  62.50  19670102 
2017-01-19 62.24  62.98  62.195  62.30  18451655 
+0

Möglicherweise möchten Sie schauen jsonlite mit :: fromJSON diese in ein Objekt konvertieren können Sie leichter manipulieren R. Zeigen Sie auch, wie Ihre gewünschte Ausgabe aussehen soll. – beigel

+0

@beigel Vielen Dank für Ihre Antwort. Ich werde in jsonlite schauen Ich habe auch die gewünschte Ausgabe hinzugefügt. – user3734010

Antwort

0

Als beigel suggested Sie das erste, was zu tun, müssen die JSON analysieren.

Lines <- 
"{                     
    \"Meta Data\": { 
    \"1. Information\": \"Daily Prices (open, high, low, close) and Volumes\", 
    \"2. Symbol\": \"MSFT\", 
    \"3. Last Refreshed\": \"2017-06-08 15:15:00\", 
    \"4. Output Size\": \"Compact\", 
    \"5. Time Zone\": \"US/Eastern\" 
    }, 
    \"2017-01-19\": { 
     \"1. open\": \"62.2400\", 
     \"2. high\": \"62.9800\", 
     \"3. low\": \"62.1950\", 
     \"4. close\": \"62.3000\", 
     \"5. volume\": \"18451655\" 
    }, 
    \"2017-01-18\": { 
     \"1. open\": \"62.6700\", 
     \"2. high\": \"62.7000\", 
     \"3. low\": \"62.1200\", 
     \"4. close\": \"62.5000\", 
     \"5. volume\": \"19670102\" 
    }, 
    \"2017-01-17\": { 
     \"1. open\": \"62.6800\", 
     \"2. high\": \"62.7000\", 
     \"3. low\": \"62.0300\", 
     \"4. close\": \"62.5300\", 
     \"5. volume\": \"20663983\" 
    } 
}" 
parsedLines <- jsonlite::fromJSON(Lines) 

Jetzt, da die Daten in einer brauchbaren Struktur sind, können wir mit der Reinigung beginnen. Beachten Sie, dass jedes Element in parsedLines eine andere Liste ist. Lassen Sie uns sie in Vektoren mit unlist konvertieren, so werden wir eine Liste von Vektoren anstelle einer Liste von Listen haben.

parsedLines <- lapply(parsedLines, unlist) 

Jetzt haben Sie vielleicht bemerkt, dass das erste Element in parsedLines Metadaten. Wir können das später an das endgültige Objekt anhängen. Aber zuerst lassen Sie uns alle anderen Elemente in eine Matrix rbind. Wir können das für jede Länge Liste mit do.call tun.

ohlcv <- do.call(rbind, parsedLines[-1]) # [-1] removes the first element 

Jetzt können wir die Spaltennamen bereinigen und die Daten von Zeichen in numerische konvertieren.

colnames(ohlcv) <- gsub("^[[:digit:]]\\.", "", colnames(ohlcv)) 
ohlcv <- type.convert(ohlcv) 

An diesem Punkt würde ich persönlich zu einem XTS-Objekt konvertieren und die Metadaten anhängen. Aber man kann mit der ohlcv Matrix weiterhin, wandelt es in ein data.frame, tibble usw.

# convert to xts 
x <- as.xts(ohlcv, dateFormat = "Date") 
# attach attributes 
metadata <- parsedLines[[1]] 
names(metadata) <- gsub("[[:digit:]]|\\.|[[:space:]]", "", names(metadata)) 
xtsAttributes(x) <- metadata 
# view attributes 
str(x) 

An 'xts' object on 2017-01-17/2017-01-19 containing: 
    Data: num [1:3, 1:5] 62.7 62.7 62.2 62.7 62.7 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:5] " open" " high" " low" " close" ... 
    Indexed by objects of class: [Date] TZ: UTC 
    xts Attributes: 
List of 5 
$ Information : chr "Daily Prices (open, high, low, close) and Volumes" 
$ Symbol  : chr "MSFT" 
$ LastRefreshed: chr "2017-06-08 15:15:00" 
$ OutputSize : chr "Compact" 
$ TimeZone  : chr "US/Eastern" 
+0

Danke @Joshua und @Beigel! Ich schätze deine Zeit und Hilfe bei dieser Frage sehr! Ich konnte die Daten bereinigen und es ist jetzt nutzbar! – user3734010

Verwandte Themen