2010-04-11 22 views
118

¿Hay alguna forma de importar datos de un archivo JSON a R? Más específicamente, el archivo es una matriz de objetos JSON con campos de cadena, objetos y matrices. El paquete RJSON no es muy claro sobre cómo lidiar con este http://cran.r-project.org/web/packages/rjson/rjson.pdf.Importación de datos de un archivo JSON a R

+3

Duplicado: http://stackoverflow.com/questions/2061897/parse-json-with-r. Si tiene un ejemplo de datos específico, eso ayudaría. De lo contrario, rjson puede hacer lo que necesita, junto con la manipulación de datos (por ejemplo, con una función de aplicar o plyr). – Shane

+0

También es similar a esta pregunta: http://stackoverflow.com/questions/2260147/transposing-json-list-of-dictionaries-for-analysis-in-r. – Shane

+0

Hola Shane, intenté usar RJSON. Estoy interesado principalmente en la manipulación de datos necesaria. Aquí hay un ejemplo de un archivo JSON con el que estoy trabajando. example.json: [{"winner": "68694999", "votes": [{"ts": "Thu Mar 25 03:13:01 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}}, {"ts": "Jue mar 25 03:13:08 UTC 2010", "usuario": {"nombre": "Lamur", "user_id": " 68694999 "}}]," lastVote ": {" timestamp ": 1269486788526," user ": {" name ":" Lamur "," user_id ":" 68694999 "}}," startPrice ": 0}, ... ] – user313967

Respuesta

139

Primero instalar el paquete de rjson:

install.packages("rjson") 

continuación:

library("rjson") 
json_file <- "http://api.worldbank.org/country?per_page=10&region=OED&lendingtype=LNX&format=json" 
json_data <- fromJSON(paste(readLines(json_file), collapse="")) 

Actualización: desde la versión 0.2.1

json_data <- fromJSON(file=json_file) 
28

Un paquete alternativo es RJSONIO. Para convertir una lista anidada, lapply puede ayudar:

l <- fromJSON('[{"winner":"68694999", "votes":[ 
    {"ts":"Thu Mar 25 03:13:01 UTC 2010", "user":{"name":"Lamur","user_id":"68694999"}}, 
    {"ts":"Thu Mar 25 03:13:08 UTC 2010", "user":{"name":"Lamur","user_id":"68694999"}}], 
    "lastVote":{"timestamp":1269486788526,"user": 
    {"name":"Lamur","user_id":"68694999"}},"startPrice":0}]' 
) 
m <- lapply(
    l[[1]]$votes, 
    function(x) c(x$user['name'], x$user['user_id'], x['ts']) 
) 
m <- do.call(rbind, m) 

brinda información sobre los votos en su ejemplo.

+1

'x $ user $ name, x $ user $ user_id' ahora debería ser' x $ user ['name'], x $ user ['user_id'] '. Además, 'm <- do.call (rbind, m)' podría ser una mejor forma de convertir la lista en una matriz. – jbaums

+1

gracias por señalar esto, lo arregló. –

+0

¿hay algo así como la función convertToDataFrame para JSON (como lo hay para el paquete XML)? – userJT

14

Si la URL es https, como utilizado por Amazon S3, a continuación, utilizar getUrl

json <- fromJSON(getURL('https://s3.amazonaws.com/bucket/my.json')) 
+7

PSA: getURL está en el RCurl pacakge. –

+0

Además, 'Error en la función (tipo, mensaje, asError = VERDADERO): Protocolo" s3 "no admitido o deshabilitado en libcurl' – d8aninja

52

jsonlite importará el JSON en una trama de datos. Opcionalmente puede aplanar objetos anidados. Las matrices anidadas serán marcos de datos.

> library(jsonlite) 
> winners <- fromJSON("winners.json", flatten=TRUE) 
> colnames(winners) 
[1] "winner" "votes" "startPrice" "lastVote.timestamp" "lastVote.user.name" "lastVote.user.user_id" 
> winners[,c("winner","startPrice","lastVote.user.name")] 
    winner startPrice lastVote.user.name 
1 68694999   0    Lamur 
> winners[,c("votes")] 
[[1]] 
          ts user.name user.user_id 
1 Thu Mar 25 03:13:01 UTC 2010  Lamur  68694999 
2 Thu Mar 25 03:13:08 UTC 2010  Lamur  68694999 
+2

Me gusta esta respuesta y la biblioteca más que la aceptada –

0

Primero instalar el paquete de RJSONIO y RCurl:

install.packages("RJSONIO") 
 
install.packages("(RCurl")

Trate a continuación código usando RJSONIO en la consola

library(RJSONIO) 
 
library(RCurl) 
 
json_file = getURL("https://raw.githubusercontent.com/isrini/SI_IS607/master/books.json") 
 
json_file2 = RJSONIO::fromJSON(json_file) 
 
head(json_file2)

Cuestiones relacionadas