Skip to content
Prev 246735 / 398503 Next

Parsing JSON records to a dataframe

On 01/07/2011 12:05 AM, Dieter Menne wrote:
This doesn't create the required structure
{
 "name": [ "joe", "anna", "joe", "anna" ],
   "gender": [ "male", "female", "male", "female" ],
   "age": [ "23", "41", "23", "41" ]
}

instead

library(rjson)
n <- 1000
name <- apply(matrix(sample(letters, n * 5, TRUE), n),
              1, paste, collapse="")
gender <- sample(c("male", "female"), n, TRUE)
age <- ceiling(runif(n, 20, 60))
recs <- sprintf('{"name": "%s", "gender":"%s", "age":%d}',
                name, gender, age)
j <- sprintf("[%s]", paste(recs, collapse=","))
lol <- fromJSON(j)

and then with

f <- function(lst)
    function(nm) unlist(lapply(lst, "[[", nm), use.names=FALSE)
+     df0 <- as.data.frame(Map(f(lol), names(lol[[1]])))
+ })
   user  system elapsed
  0.006   0.000   0.006

versus for instance
+     df1 <- do.call(rbind, lapply(lol, data.frame))
+ })
   user  system elapsed
  1.497   0.000   1.500
[1] TRUE

Martin