2016-11-17 124 views
1

我想一个data.frame转换成JSON格式[R转换data.frame以JSON

我data.frame具有以下结构

a <- rep(c("Mario", "Luigi"), each = 3) 
b <- sample(34:57, size = length(a)) 
df <- data.frame(a,b) 
> df 
     a b 
1 Mario 43 
2 Mario 34 
3 Mario 36 
4 Luigi 45 
5 Luigi 52 
6 Luigi 35 

我想创造是一样的东西这个(最终它打印到以.json文件)

[ 
    { 
    "a": "Mario", 
    "b": [43, 34, 36] 
    }, 
    { 
    "a": "Luigi", 
    "b": [45, 52, 35] 
    } 
] 

我已经尝试了不同的封装处理JSON格式,但迄今未能产生这种类型的输出。我通常最终会像这样的东西

[ 
    { 
    "a":"Mario", 
    "b":43 
    }, 
    { 
    "a":"Mario", 
    "b":34 
    }, 
    { 
    "a":"Mario", 
    "b":36 
    }, 
    { 
    "a":"Luigi", 
    "b":45 
    }, 
    { 
    "a":"Luigi", 
    "b":52 
    }, 
    { 
    "a":"Luigi", 
    "b":35 
    } 
] 

回答

5

如果你巢b作为一个列表列,它会正确地转换:

library(jsonlite) 

# converts b to nested list column 
df2 <- aggregate(b ~ a, df, list) 

df2 
##  a   b 
## 1 Luigi 49, 42, 37 
## 2 Mario 46, 50, 45 

toJSON(df2, pretty = TRUE) 
## [ 
## { 
##  "a": "Luigi", 
##  "b": [49, 42, 37] 
## }, 
## { 
##  "a": "Mario", 
##  "b": [46, 50, 45] 
## } 
## ] 

或者如果你喜欢dplyr:

library(dplyr) 

df %>% group_by(a) %>% 
    summarise(b = list(b)) %>% 
    toJSON(pretty = TRUE) 

或data.table:

library(data.table) 

toJSON(setDT(df)[, .(b = list(b)), by = a], pretty = TRUE) 

它们都返回相同的东西。

+0

这是一个更好的方法,这个例子 - 高兴地把我的'剔'带走:) – SymbolixAU

+0

同意,似乎是更一般的方法! – georg23

2

为了让你将要在一个列表中的数据所需的JSON结构是这样的:

l <- list(list(a = "Mario", 
       b = c(43,34,36)), 
      list(a = "Luigi", 
       b = c(45,52,35))) 

## then can use the library(jsonlite) to convert to JSON 

library(jsonlite) 

toJSON(l, pretty = T) 

[ 
    { 
    "a": ["Mario"], 
    "b": [43, 34, 36] 
    }, 
    { 
    "a": ["Luigi"], 
    "b": [45, 52, 35] 
    } 
] 

所以将数据分割成这种格式,你可以做

l <- lapply(unique(df$a), function(x) list(a = x, b = df[a == x,"b"]) ) 

## and then the conversion works 
toJSON(l, pretty = T) 

[ 
    { 
    "a": ["Mario"], 
    "b": [44, 49, 50] 
    }, 
    { 
    "a": ["Luigi"], 
    "b": [39, 57, 35] 
    } 
] 

这适用于简单的情况下,但如果它变得更加复杂,可能是更好的重新设计,你如何创建data.frame,而是创建一个列表(S)开始。


参考

jsonlite vignette是一个很好的资源。