Как создать вложенный массив объектов из фрейма данных

Я хотел бы получить вложенный массив объектов (JSON), используя пакет jsonlite в R из data.frame формат. Позвольте мне привести пример

library(jsonlite)
time <- c(1,1,2,2)
ps <- c("p1","p2","p1","p2")
v1 <- c(5,6,7,8)
v2 <- c(10,11,12,13)
df <- data.frame(ps, v1,v2)
toJSON(df)

Вот df это фрейм данных в R и я получаю массив объектов в формате Json:

[{"ps":"p1","v1":5,"v2":10},
 {"ps":"p2","v1":6,"v2":11},
 {"ps":"p1","v1":7,"v2":12},
 {"ps":"p2","v1":8,"v2":13}] 

Тем не менее, я хотел бы добиться следующего результата, где по сути у меня есть вложенная структура. Добавляя что-то вроде другого группового аргумента (время) здесь, df в длинном формате выглядит

df2 <- data.frame(time,ps, v1,v2)

который

df2
  time ps v1 v2
1    1 p1  5 10
2    1 p2  6 11
3    2 p1  7 12
4    2 p2  8 13

Мой окончательный вывод, который я хотел бы получить (в формате Json):

[{
  "time": "1"
  "all_ps":[
    {
      "ps":"p1",
      "v1":5,
      "v2":10    
    },
    {
      "ps":"p2",
      "v1":6,
      "v2":11
    }]
  },
  {
    "time": "2"
    "all_ps":[
  {
    "ps":"p1",
    "v1":5,
    "v2":10    
  },
  {
    "ps":"p2",
    "v1":6,
    "v2":11
  }]  
  }
 ]

где all_ps это как дополнительная структура или группировка. это all_ps дано, но я не знаю, как добавить его во фрейм данных, чтобы получить желаемый результат. Как я могу добиться этого в R используя jsonlite?

2 ответа

Решение

Еще один способ разбить ваш фрейм данных, не зная содержимого в time колонка:

library(jsonlite)
ansLs <- lapply(split(df2, df2$time), 
    function(x) list(time=as.character(x$time[1]),  all_ps=x[-1]))
toJSON(unname(ansLs), auto_unbox = TRUE)

Это работает:

library(magrittr)
library(jsonlite)
lapply(as.list(1:2), function(x) list(time = as.character(x), 
                                      "all_ps" = df[time == x, ])) %>%
    toJSON(auto_unbox = TRUE)
Другие вопросы по тегам