Длинная таблица для вложенного списка в JSON с использованием R и Tidyverse - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь преобразовать длинную таблицу (например, пример ниже) во вложенный список в JSON, используя R / tidyverse и один из пакетов 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 голосов
/ 21 мая 2018

Для большинства выходных данных 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...