2016-03-19 6 views
1

Ich versuche, Daten von einer Web-API mit jsonlite zu analysieren, aber aus irgendeinem Grund ist das Objekt, das es zurückgibt, eine Liste.Warum analysiert jsonlite Daten in ein Listenobjekt?

Es wird in der jsonlite Paketdokumentation gesagt, dass der Vereinfachungsprozess JSON-Liste automatisch in eine spezifischere R-Klasse konvertiert, aber in meinem Fall funktioniert es nicht.

Es ist wie simplifyVector, simplifyDataFrame und simplifyMatrix Funktion sind deaktiviert, aber jeder ist standardmäßig aktiviert.

Was ich möchte ist ein Datenframe zum Abrufen der $Name Daten (EAC, EFL, ELC, etc.).

Ich versuche auch mit der rjson Bibliothek, aber immer noch das gleiche Problem.

Irgendeine Idee, was könnte falsch sein?

Danke,

finden Sie den Code ich benutze:

raw <- getURL("https://www.cryptocompare.com/api/data/coinlist") 
library(jsonlite) 
data <- fromJSON(txt=raw) 

> class(data) 
[1] "list" 

> typeof(data) 
[1] "list" 

> str(data) 
[...] 
    ..$ EAC :List of 13 
    .. ..$ Id     : chr "4437" 
    .. ..$ Url    : chr "/coins/eac/overview" 
    .. ..$ ImageUrl   : chr "/media/19690/eac.png" 
    .. ..$ Name    : chr "EAC" 
    .. ..$ CoinName   : chr "EarthCoin" 
    .. ..$ FullName   : chr "EarthCoin (EAC)" 
    .. ..$ Algorithm   : chr "Scrypt" 
    .. ..$ ProofType   : chr "PoW" 
    .. ..$ FullyPremined  : chr "0" 
    .. ..$ TotalCoinSupply : chr "13500000000" 
    .. ..$ PreMinedValue  : chr "N/A" 
    .. ..$ TotalCoinsFreeFloat: chr "N/A" 
    .. ..$ SortOrder   : chr "100" 
    ..$ EFL :List of 13 
    .. ..$ Id     : chr "4438" 
    .. ..$ Url    : chr "/coins/efl/overview" 
    .. ..$ ImageUrl   : chr "/media/19692/efl.png" 
    .. ..$ Name    : chr "EFL" 
    .. ..$ CoinName   : chr "E-Gulden" 
    .. ..$ FullName   : chr "E-Gulden (EFL)" 
    .. ..$ Algorithm   : chr "Scrypt" 
    .. ..$ ProofType   : chr "PoW" 
    .. ..$ FullyPremined  : chr "0" 
    .. ..$ TotalCoinSupply : chr "21000000 " 
    .. ..$ PreMinedValue  : chr "N/A" 
    .. ..$ TotalCoinsFreeFloat: chr "N/A" 
    .. ..$ SortOrder   : chr "101" 
    ..$ ELC :List of 13 
    .. ..$ Id     : chr "4439" 
    .. ..$ Url    : chr "/coins/elc/overview" 
    .. ..$ ImageUrl   : chr "/media/19694/elc.png" 
    .. ..$ Name    : chr "ELC" 
    .. ..$ CoinName   : chr "Elacoin" 
    .. ..$ FullName   : chr "Elacoin (ELC)" 
    .. ..$ Algorithm   : chr "Scrypt" 
    .. ..$ ProofType   : chr "PoW" 
    .. ..$ FullyPremined  : chr "0" 
    .. ..$ TotalCoinSupply : chr "75000000" 
    .. ..$ PreMinedValue  : chr "N/A" 
    .. ..$ TotalCoinsFreeFloat: chr "N/A" 
    .. ..$ SortOrder   : chr "102" 
    .. [list output truncated] 
$ Type  : int 100 
NULL 
+0

Ich stelle mir vor, dass 'fromJSON()' hat entschieden, dass diese Liste ist bereits in seiner einfachsten Form. Sie haben dort eine verschachtelte Liste. Wahrscheinlich müssen Sie den Rest der Arbeit selbst erledigen. –

Antwort

2

ich auf meine eigene Frage beantworten, wie - schon im Kommentarbereich gesagt - zurückgegebene Objekt bereits in der einfachsten Form. Wahrscheinlich kann jsonlite Datenrahmen nicht aus mehreren Listen erstellen (Listenüberlappung).

Die Lösung, die ich gefunden habe, ist unlist und data.frame wie folgt zu verwenden:

> df <- data.frame(unlist(data)) 
> class(df) 
[1] "data.frame" 
+0

Ich glaube nicht, dass das ein sehr nützliches Ergebnis ist: '> str (df) 'data.frame': \t 6411 obs. von 1 Variable: $ unlist.data .: Faktor w/3674 Ebenen "27625814", "ClubCoin", ..: 3436 2443 2833 2833 1005 57 518 2350 2266 2267 ... ' –

2

Sie das untere Ende der Struktur zeigte, aber die Antwort auf die Frage nach, warum ein Datenrahmen nicht gesehen wird bei zurück die Spitze der Struktur:

# note: needed `require(RCurl)` to obtain getURL 
> str(data) 
List of 6 
$ Response : chr "Success" 
$ Message  : chr "Coin list succesfully returned!" 
$ BaseImageUrl: chr "https://www.cryptocompare.com" 
$ BaseLinkUrl : chr "https://www.cryptocompare.com" 
$ Data  :List of 492 
    ..$ BTC :List of 13 
    .. ..$ Id     : chr "1182" 
    .. ..$ Url    : chr "/coins/btc/overview" 
    .. ..$ ImageUrl   : chr "/media/19633/btc.png" 
    .. ..$ Name    : chr "BTC" 
    .. ..$ CoinName   : chr "Bitcoin" 
    .. ..$ FullName   : chr "Bitcoin (BTC)" 
    .. ..$ Algorithm   : chr "SHA256" 
# ------snipped the many, many pages of output that followed--------- 

hat darüber hinaus den $ Data Knoten dieser Liste unregelmäßigen Längen so zu einem Datenrahmen in einem Schritt zu zwingen könnte schwierig sein:

> table(sapply(data$Data, length)) 

12 13 14 
    2 478 12 

Nach dem Laden Pkg: plyr, die eine nützliche Funktion bietet ähnlich wie rbind aber nicht identisch Datenrahmen Ich bin in der Lage ein nützlicher Ausgangspunkt für furhter Analyse contruct:

require(plyr) 
money <- do.call(rbind.fill, lapply(data$Data, data.frame, stringsAsFactors=FALSE)) 
str(money) 
#------------  
'data.frame': 492 obs. of 14 variables: 

$ Id     : chr "1182" "3808" "3807" "5038" ... 
$ Url    : chr "/coins/btc/overview" "/coins/ltc/overview" "/coins/dash/overview" "/coins/xmr/overview" ... 
$ ImageUrl   : chr "/media/19633/btc.png" "/media/19782/ltc.png" "/media/20626/dash.png" "/media/19969/xmr.png" ... 
$ Name    : chr "BTC" "LTC" "DASH" "XMR" ... 
$ CoinName   : chr "Bitcoin" "Litecoin" "DigitalCash" "Monero" ... 
$ FullName   : chr "Bitcoin (BTC)" "Litecoin (LTC)" "DigitalCash (DASH)" "Monero (XMR)" ... 
$ Algorithm   : chr "SHA256" "Scrypt" "X11" "CryptoNight" ... 
$ ProofType   : chr "PoW" "PoW" "PoW/PoS" "PoW" ... 
$ FullyPremined  : chr "0" "0" "0" "0" ... 
$ TotalCoinSupply : chr "21000000" "84000000" "22000000" "0" ... 
$ PreMinedValue  : chr "N/A" "N/A" "N/A" "N/A" ... 
$ TotalCoinsFreeFloat: chr "N/A" "N/A" "N/A" "N/A" ... 
$ SortOrder   : chr "1" "3" "4" "5" ... 
$ TotalCoinsMined : chr NA NA NA NA ... 

Wenn Sie in der Lage sein wollte Zugriff auf die Zeilen anhand der Abkürzungen für die Krypto-Währungen, könnten Sie tun:

rownames(money) <- names(data$Data) 

die jetzt können Sie dies tun:

> money[ "BTC", ] 
     Id     Url    ImageUrl Name CoinName 
BTC 1182 /coins/btc/overview /media/19633/btc.png BTC Bitcoin 
     FullName Algorithm ProofType FullyPremined TotalCoinSupply 
BTC Bitcoin (BTC) SHA256  PoW    0  21000000 
    PreMinedValue TotalCoinsFreeFloat SortOrder TotalCoinsMined 
BTC   N/A     N/A   1   <NA> 

Wo, bevor der Zugang wäre ein bisschen mehr klobig waren:

> money[ money$Name=="BTC", ] 
+0

Vielen Dank. Ich konnte den Beginn der Konsolenausgabe nicht erfassen. – Florent

Verwandte Themen