2016-11-17 97 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是一個很好的資源。