Напишите 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
}
]
}
]