Напишите JSON с несколькими входами в R

У меня есть тиббл и список, который я хотел бы записать в файл json.

# A tibble: 2 x 12
  i     n          c             C     r                    F     L     b     s     q t         x      
  <chr> <chr>      <chr>         <chr> <chr>            <dbl> <dbl> <dbl> <dbl> <int> <chr>     <chr>  
1 SHH   Shishmaref United States US    Northern America  66.3 -166.  94.4 0.752  4417 0,0,0,0,0 OME,271
2 WAA   Wales      United States US    Northern America  65.6 -168.  94.2 0.757  4443 0,1,0,0,0 OME,270

Я хотел бы заменить столбец "х" со списком.

Когда я пытаюсь объединить по столбцу 'i' с элементом списка, много данных дублируется...:/

Пример списка:

$ZVK
     d   p
1: BKK 134

$ZYL
     d   p
1: DXB 323

Я хотел бы в конечном итоге что-то похожее на это:

[
  {
    "i": "SHH",
    "n": "Shishmaref",
    "c": "United States",
    "C": "US",
    "r": "Northern America",
    "F": 66.256,
    "L": -166.063,
    "b": 94.42,
    "s": 0.752,
    "q": 4417,
    "t": "0,0,0,0,0",
    "x": [{
              "d": "TSN",
              "p": 47
            },
            {
              "d": "JHG",
              "p": 54
            },
            {
              "d": "LJG",
              "p": 56
            }]
}
  ...
]

Я думаю, что должен быть способ написать файл json без слияния списка и тиббла, или, может быть, есть способ слить их рваным способом?

0 ответов

Мы можем сделать следующее:

tbl
# A tibble: 1 x 13
#       X i     n      c             C     r                 F      L     b     s     q t        x               
#   <int> <fct> <fct>  <fct>         <fct> <fct>         <dbl>  <dbl> <dbl> <dbl> <int> <fct>    <fct>           
# 1     1 LON   London United Kingd… GB    Northern Eur…  51.5 -0.127  55.4  1.25  2088 0,0,1,3… AAL,15;AAR,15;A…

require(tidyverse)
tbl$x <- map(tbl$x, ~ strsplit(., ";|,")[[1]] %>%
             {data.frame(d = .[c(T, F)], p = as.numeric(.[c(F, T)]))})

Последние две строки являются сокращенной версией этого базового R-эквивалента:

tbl$x <- lapply(tbl$x, function(r) {
  tmp <- strsplit(r, ";|,")[[1]]
  data.frame(d = tmp[seq(1, length(tmp), 2)],
             p = as.numeric(tmp[seq(2, length(tmp), 2)]))
})

Мы проходим x столбец, разделить его элементы по ; а также , по возможности, а затем использовать тот факт, что результирующие нечетные элементы будут соответствовать d столбец в желаемом результате, и четные элементы p колонка.

Выход:

toJSON(tbl, pretty = TRUE)
[
  {
    "X": 1,
    "i": "LON",
    "n": "London",
    "c": "United Kingdom",
    "C": "GB",
    "r": "Northern Europe",
    "F": 51.508,
    "L": -0.127,
    "b": 55.43,
    "s": 1.25,
    "q": 2088,
    "t": "0,0,1,3,1",
    "x": [
      {
        "d": "AAL",
        "p": 15
      },
      {
        "d": "AAR",
        "p": 15
      },
      {
        "d": "ABZ",
        "p": 48
      }
    ]
  }
] 
Другие вопросы по тегам