使用R和tidyverse将长表嵌套到JSON的长表

时间:2018-05-21 19:09:54

标签: r json tidyverse

我正在尝试使用R / tidyverse和其中一个JSON包将长表(例如下面的示例)转换为嵌套列表到JSON中。我怀疑这可以通过某种方式使用split / purrr完成,但我无法弄清楚究竟是如何。

采用以下示例输入:

library(tidyverse)
library(stringi)

df = data.frame(patient   = c(rep("A",4), rep("B",4)),
                sample    = rep(c("P","R"),4),
                file      = stri_rand_strings(8, 6, '[A-Z]'))

例如,这样的

  patient sample   file
1       A      P ZZEVYQ
2       A      R KIUXRU
3       A      P XRYBUE
4       A      R ZCHBKN
5       B      P WZYAPM
6       B      R EKDFYT
7       B      P CYEJCK
8       B      R XFAYXX

我想输出与此类似的内容(注意:手动输入)。

[
  {
    "patient" : "A",
    "samples" : [
      {
        "sample" : "P",
        "files" : [
          {
            "file" : "ZZEVYQ"
          },
          {
            "file" : "XRYBUE"
          }
        ] 
      },
      {
        "sample" : "R",
        "files" : [
          {
            "file" : "KIUXRU"
          },
          {
            "file" : "ZCHBKN"
          }
        ]
      }
    ]
  },
  {
    "patient" : "B",
    "samples" : [
      {
        "sample" : "P",
        "files" : [
          {
            "file" : "WZYAPM"
          },
          {
            "file" : "CYEJCK"
          }
          ] 
      },
      {
        "sample" : "R",
        "files" : [
          {
            "file" : "EKDFYT"
          },
          {
            "file" : "XFAYXX"
          }
        ]
      }
    ]
  }
]

有关如何执行此操作的任何建议吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

对于大多数json输出,如果需要嵌套级别,则需要嵌套数据。这是实现获取JSON所需的连接的一种方法

dfout <- df %>% group_by(patient, sample) %>% 
  summarize(files=list(map(file, ~list(file=.x)))) %>% 
  summarize(samples=list(map2(sample, files, ~list(samples=.x, files=.y))))

jsonlite::toJSON(dfout, auto_unbox = TRUE)