2017-12-31 168 views
1

Neu in diesem Forum mit meiner ersten Frage und 3 Tage Erfahrung mit R, JSON Daten und APIs, Entschuldigen Sie bitte jede Naivität. Wie auch immer, sehr aufgeregt über das Lernen !!"Fehler: Argumente implizieren unterschiedliche Anzahl von Zeilen: 1, 0" beim Versuch, eine JSON-Datei in einen Datenrahmen zu konvertieren

Ich versuche, eine Json-Daten von der folgenden API-Endpunkt in einen brauchbaren Datenrahmen zu konvertieren. Hier ist der Link zu JSON: https://api.binance.com/api/v1/depth?symbol=ETHBTC. Ich bin folgenden Code verwenden, dies zu tun (vereinfacht):

library(jsonlite) 
library(httr) 

endpoint <- "https://api.binance.com/api/v1/depth?symbol=ETHBTC" 
dt_text <- content(GET(endpoint), "text") 
dt_json <- fromJSON(dt_text, flatten = TRUE) 
df_GetDepth <- as.data.frame(dt_json) 

Allerdings erhalte ich diese Fehlermeldung:

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : 
    arguments imply differing number of rows: 1, 0** 

auf Debuggen, ist der Fehler in der letzten Zeile, höchstwahrscheinlich, weil die ersten Spalte in den JSON-Daten hat nur einen Eintrag, während andere Spalten mehr zu haben scheinen. Anbei ein Übersichtsausschnitt der json-Daten:

{ 
    "lastUpdateId": 1027024, 
    "bids": [ 
    [ 
     "4.00000000",  // PRICE 
     "431.00000000", // QTY 
     []    // Can be ignored 
    ] 
    ], 
    "asks": [ 
    [ 
     "4.00000200", 
     "12.00000000", 
     [] 
    ] 
    ] 
} 

Freue mich wirklich darauf, von den Experten zu lernen !!

Aditya

Antwort

0

eine Teilmenge der Daten unter Verwendung von (Weglassen "lastUpdateId", und nur die ersten drei von jeweils "asks" und "bids") Verwenden eines von:

dt2 <- lapply(dt_json, head, 3)[c("bids","asks")] 
dt2 <- structure(list(bids = list(list("0.05309400", "8.00000000", character(0)), 
    list("0.05308800", "25.79300000", character(0)), list("0.05308600", 
     "8.25500000", character(0))), asks = list(list("0.05317900", 
    "0.15500000", character(0)), list("0.05319400", "0.04100000", 
    character(0)), list("0.05319600", "1.50000000", character(0)))), .Names = c("bids", 
"asks")) 

str(dt2) 
# List of 2 
# $ bids:List of 3 
# ..$ :List of 3 
# .. ..$ : chr "0.05309400" 
# .. ..$ : chr "8.00000000" 
# .. ..$ : chr(0) 
# ..$ :List of 3 
# .. ..$ : chr "0.05308800" 
# .. ..$ : chr "25.79300000" 
# .. ..$ : chr(0) 
# ..$ :List of 3 
# .. ..$ : chr "0.05308600" 
# .. ..$ : chr "8.25500000" 
# .. ..$ : chr(0) 
# $ asks:List of 3 
# ..$ :List of 3 
# .. ..$ : chr "0.05317900" 
# .. ..$ : chr "0.15500000" 
# .. ..$ : chr(0) 
# ..$ :List of 3 
# .. ..$ : chr "0.05319400" 
# .. ..$ : chr "0.04100000" 
# .. ..$ : chr(0) 
# ..$ :List of 3 
# .. ..$ : chr "0.05319600" 
# .. ..$ : chr "1.50000000" 
# .. ..$ : chr(0) 

Der erste Schritt, rbind-ing Dinge:

dt3 <- lapply(dt2, function(a) do.call(rbind, lapply(a, function(b) rbind(Filter(length, b))))) 
dt3 
# $bids 
#  [,1]   [,2]   
# [1,] "0.05309400" "8.00000000" 
# [2,] "0.05308800" "25.79300000" 
# [3,] "0.05308600" "8.25500000" 
# $asks 
#  [,1]   [,2]   
# [1,] "0.05317900" "0.15500000" 
# [2,] "0.05319400" "0.04100000" 
# [3,] "0.05319600" "1.50000000" 

Und Umwandlung dann in Zahlen:

Dies erzeugt Matrizen, die leicht genug sein sollten, um bei Bedarf in data.frames zu konvertieren und Spaltennamen anzuwenden.

Verwandte Themen