Генерация вложенных JSON с использованием R - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь сгенерировать вложенный файл JSON, используя R, и у меня возникают трудности при его настройке. По общему признанию я очень плохо знаком с JSON, так что концептуально я позади. Я был бы признателен за любую помощь, в том числе советы о местах (кроме R), которые облегчили бы эту задачу.

У меня есть 3 набора данных, с которыми я работаю - все подключены через ключи. По сути, моя цель - создать файл JSON, который содержит объекты пациента, с вложенными встречами и внутри этих встреч, вложенными линиями заявок.

Вот настройка в R:

patients <- data.frame (
                      PatientID = c('PID01','PID02'),
                      PatientName = c('John Doe','Jane Doe'),
                      PatientGroup = c('Group A','Group B')
                    )

encounters <- data.frame (
                          EncounterID = c('Enc01','Enc02','Enc03','Enc04','Enc05'),
                          PatientID = c('PID01','PID01','PID02','PID02','PID02'),
                          EncounterType = c('Outpatient','Outpatient','Inpatient','Outpatient','SNF')
                         )

encounterLines <- data.frame (
                              EncounterID = c(rep('Enc01',5),rep('Enc04',2)),
                              RevCodes = c('001','100','200','300','400','001','100'),
                              ClaimLine = c(seq(1:5),seq(1:2))
                              )

 ----------------------------------------
 PatientID   PatientName   PatientGroup 
----------- ------------- --------------
   PID01      John Doe       Group A    

   PID02      Jane Doe       Group B    
----------------------------------------

-----------------------------------------
 EncounterID   PatientID   EncounterType 
------------- ----------- ---------------
    Enc01        PID01      Outpatient   

    Enc02        PID01      Outpatient   

    Enc03        PID02       Inpatient   

    Enc04        PID02      Outpatient   

    Enc05        PID02          SNF      
-----------------------------------------

------------------------------------
 EncounterID   RevCodes   ClaimLine 
------------- ---------- -----------
    Enc01        001          1     

    Enc01        100          2     

    Enc01        200          3     

    Enc01        300          4     

    Enc01        400          5     

    Enc04        001          1     

    Enc04        100          2     
------------------------------------

Вывод JSON, который я ищу, выглядит следующим образом. Я пытался использовать jsonlite, но, похоже, я не могу добиться какой-либо реальной тяги:

[
    {
        "PatientID": "PID01",
        "PatientName": "John Doe",
        "PatientGroup": "Group A",
        "Encounters": [
            {
                "EncounterID": "Enc01",
                "EncounterType": "Outpatient",
                "ClaimLines": [
                    {
                        "ClaimLine": 1,
                        "RevenueCode": "001"
                    },
                    {
                        "ClaimLine": 2,
                        "RevenueCode": "100"
                    },
                    {
                        "ClaimLine": 3,
                        "RevenueCode": "200"
                    },
                    {
                        "ClaimLine": 4,
                        "RevenueCode": "300"
                    },
                    {
                        "ClaimLine": 5,
                        "RevenueCode": "400"
                    }
                ]
            },
            {
                "EncounterID": "Enc02",
                "EncounterType": "Outpatient"
            }
        ]
    },
    {
        "PatientID": "PID02",
        "PatientName": "Jane Doe",
        "PatientGroup": "Group B",
        "Encounters": [
            {
                "EncounterID": "Enc03",
                "EncounterType": "Inpatient"
            },
            {
                "EncounterID": "Enc04",
                "EncounterType": "Outpatient",
                "ClaimLines": [
                    {
                        "ClaimLine": 1,
                        "RevenueCode": "001"
                    },
                    {
                        "ClaimLine": 2,
                        "RevenueCode": "100"
                    }
                ]
            },
            {
                "EncounterID": "Enc05",
                "EncounterType": "SNF"
            }
        ]
    }
]

Любая / вся помощь будет с благодарностью принята. Как я упоминал ранее, я не против использования инструментов за пределами R.

Спасибо!

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Пара data.table присоединяется, и вы тоже можете туда добраться

library(data.table)
setDT( patients )
setDT( encounters )
setDT( encounterLines )

## do a 'left-join' by putting 
## encounterLines onto encounters
dt_encounters <- encounterLines[
  encounters
  , on = "EncounterID"
  , nomatch = NA       ## indicates left-join
]

## make a list-column (required for JSON)
dt_encounters <- dt_encounters[
  , .(ClaimLines = list(.SD))
  , by = .(EncounterID, EncounterType, PatientID)
]

## do a 'left-join' by putting
## encounters onto patients
dt_patients <- dt_encounters[
  patients
  , on = "PatientID"
  , nomatch = NA
]

## make a list-column (required for JSON)
dt_patients <- dt_patients[
  , .(Encounters = list(.SD))
  , by = .(PatientID, PatientName, PatientGroup)
] 
toJSON( dt_patients, pretty = TRUE )

[
  {
    "PatientID": "PID01",
    "PatientName": "John Doe",
    "PatientGroup": "Group A",
    "Encounters": [
      {
        "EncounterID": "Enc01",
        "EncounterType": "Outpatient",
        "ClaimLines": [
          {
            "RevCodes": "001",
            "ClaimLine": 1
          },
          {
            "RevCodes": "100",
            "ClaimLine": 2
          },
          {
            "RevCodes": "200",
            "ClaimLine": 3
          },
          {
            "RevCodes": "300",
            "ClaimLine": 4
          },
          {
            "RevCodes": "400",
            "ClaimLine": 5
          }
        ]
      },
      {
        "EncounterID": "Enc02",
        "EncounterType": "Outpatient",
        "ClaimLines": [
          {}
        ]
      }
    ]
  },
  {
    "PatientID": "PID02",
    "PatientName": "Jane Doe",
    "PatientGroup": "Group B",
    "Encounters": [
      {
        "EncounterID": "Enc03",
        "EncounterType": "Inpatient",
        "ClaimLines": [
          {}
        ]
      },
      {
        "EncounterID": "Enc04",
        "EncounterType": "Outpatient",
        "ClaimLines": [
          {
            "RevCodes": "001",
            "ClaimLine": 1
          },
          {
            "RevCodes": "100",
            "ClaimLine": 2
          }
        ]
      },
      {
        "EncounterID": "Enc05",
        "EncounterType": "SNF",
        "ClaimLines": [
          {}
        ]
      }
    ]
  }
]

1 голос
/ 20 февраля 2020

Кажется, что это очень близко

library(tidyverse)
library(jsonlite)

json <- reduce(list(
    patients %>% mutate_if(is.factor, as.character),
    encounters %>% mutate_if(is.factor, as.character),
    encounterLines %>%
        mutate_if(is.factor, as.character) %>%
        group_by(EncounterID) %>%
        nest() %>%
        rename(ClaimLines = data) %>%
        mutate(ClaimLines = map(ClaimLines, transpose))),
    left_join) %>%
    nest(Encounters = c(EncounterID, EncounterType, ClaimLines)) %>%
    transpose() %>%
    toJSON(pretty = TRUE)
#[
#  {
#    "PatientID": ["PID01"],
#    "PatientName": ["John Doe"],
#    "PatientGroup": ["Group A"],
#    "Encounters": [
#      {
#        "EncounterID": "Enc01",
#        "EncounterType": "Outpatient",
#        "ClaimLines": [
#          {
#            "RevCodes": ["001"],
#            "ClaimLine": [1]
#          },
#          {
#            "RevCodes": ["100"],
#            "ClaimLine": [2]
#          },
#          {
#            "RevCodes": ["200"],
#            "ClaimLine": [3]
#          },
#          {
#            "RevCodes": ["300"],
#            "ClaimLine": [4]
#          },
#          {
#            "RevCodes": ["400"],
#            "ClaimLine": [5]
#          }
#        ]
#      },
#      {
#        "EncounterID": "Enc02",
#        "EncounterType": "Outpatient",
#        "ClaimLines": {}
#      }
#    ]
#  },
#  {
#    "PatientID": ["PID02"],
#    "PatientName": ["Jane Doe"],
#    "PatientGroup": ["Group B"],
#    "Encounters": [
#      {
#        "EncounterID": "Enc03",
#        "EncounterType": "Inpatient",
#        "ClaimLines": {}
#      },
#      {
#        "EncounterID": "Enc04",
#        "EncounterType": "Outpatient",
#        "ClaimLines": [
#          {
#            "RevCodes": ["001"],
#            "ClaimLine": [1]
#          },
#          {
#            "RevCodes": ["100"],
#            "ClaimLine": [2]
#          }
#        ]
#      },
#      {
#        "EncounterID": "Enc05",
#        "EncounterType": "SNF",
#        "ClaimLines": {}
#      }
#    ]
#  }
#]
#

Ключ заключается в том, чтобы сначала создать подходящую вложенную list (используя несколько purrr::transpose с), а затем правильно преобразовать во вложенную JSON, используя jsonlite::toJSON.

...