R将data.frame转换为json

时间:2016-11-17 21:22:30

标签: arrays 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
  }
]

2 个答案:

答案 0 :(得分: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)

两者都返回相同的东西。

答案 1 :(得分: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,而不是创建一个列表开始。

参考

jsonlite vignette是一个非常好的资源。