parse hierarchical json into table in R
Tengo muchos arrays json que no siguen el formato "atributo": "valor" que estoy acostumbrado. Quiero leerlos uno a uno y meterlos en tablas. Entonces quiero combinar las mesas. Me quedé atrapado con el mordisco.
Todos los arrays son etiquetados puestos de un foro y tienen esta estructura:
myjson = '
[{
"posts": [
[9999991, "Here is some text."],
[9999992, "Here is some other, unrelated text."]
],
"id": "123456",
"label": "whatever"
}]
'
Donde una matriz tiene un "posts", una "id", y una "etiqueta" y nada más, pero el número de []-s bajo "posts" es arbitrario (aquí, es 2).
Cuando meto esto en R usando jsonlite
Tengo un desastre. Cuando uso RJSONIO
o rjson
Tengo listas de listas de listas.
Puedo llegar a la salida deseada tocando juntos la información de las listas de listas, pero es horrible y propensa a errores:
myj = rjson::fromJSON(myjson)
post_id = c(
myj[[1]]$posts[[1]][[1]],
myj[[1]]$posts[[2]][[1]]
)
post_content = c(
myj[[1]]$posts[[1]][[2]],
myj[[1]]$posts[[2]][[2]]
)
dplyr::tibble(
id = myj[[1]]$id,
label = myj[[1]]$label,
post_id = post_id,
post_content = post_content
)
> # A tibble: 2 x 4
> id label post_id post_content
>
> 1 123456 whatever 9999991 Here is some text.
> 2 123456 whatever 9999992 Here is some other, unrelated text.
Esto no se presta a la iteración (no sé cómo referirse a myj[[1]]$posts[[1...i]][[1...ii]]
) y es probablemente muy lento.
¡Tiene que haber una mejor manera!
Pregunta hecha hace 3 años, 4 meses, 28 días - Por syntaxsniper
3 Respuestas:
-
Pruebe leer los datos usando
jsonlite::fromJSON
yunnest
los valores.library(dplyr) jsonlite::fromJSON(myjson) -> tmp tmp %>% mutate(posts = purrr::map(posts, data.frame)) %>% tidyr::unnest(posts) # X1 X2 id label #
#1 9999991 Here is some text. 123456 whatever #2 9999992 Here is some other, unrelated text. 123456 whatever Respondida el Dec 19, 2020 a las 07:32 - por rubyrogue
Votos positivos: 0 | Votos negativos: 0 -
Para transformar un JSON con una estructura jerárquica en una tabla en R de forma más eficiente y fácil de iterar, puedes usar la función
jsonlite::fromJSON
para convertir el JSON en un data frame directamente. Aquí te muestro cómo puedes hacerlo:R library(jsonlite)
JSON con estructura jerárquica
myjson <- ' [{ "posts": [ [9999991, "Here is some text."], [9999992, "Here is some other, unrelated text."] ], "id": "123456", "label": "whatever" }] 'Convertir el JSON en un data frame
df <- fromJSON(myjson, flatten = TRUE)Crear un data frame con los datos deseados
result <- data.frame(id = df$id, label = df$label, post_id = unlist(lapply(df$posts, function(x) x[1])), post_content = unlist(lapply(df$posts, function(x) x[2])))Mostrar el resultado
print(result)Con esto, evitas tener que acceder manualmente a los elementos anidados del JSON y puedes transformarlo en una tabla de forma más eficiente. Además, como resultado obtienes un data frame que es más fácil de manipular y de iterar si tienes múltiples elementos en tu JSON.
Respondida el Dec 20, 2020 a las 07:30 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Usando
rjson
Puedes usar la función
unlist()
de R para aplanar las listas anidadas:r library(rjson) myj = rjson::fromJSON(myjson) myj_flat <- unlist(myj)
Crea un data frame a partir de la lista aplanada
df <- data.frame(myj_flat)Usando
jsonlite
Con
jsonlite
, puedes utilizar la funciónflatten()
para aplanar las listas anidadas:r library(jsonlite) myj <- fromJSON(myjson) myj_flat <- flatten(myj)
Crea un data frame a partir de la lista aplanada
df <- data.frame(myj_flat)Combinación de tablas
Una vez que tengas todas las tablas creadas a partir de cada matriz JSON, puedes combinarlas usando la función
bind_rows()
:r
Suponiendo que tienes varias tablas llamadas df1, df2, ..., dfN
combined_df <- bind_rows(df1, df2, ..., dfN)Esto creará un nuevo data frame que contiene todas las filas de las tablas originales.
Respondida el Dec 20, 2020 a las 07:40 - por Gemini
Votos positivos: 0 | Votos negativos: 0