【问题标题】:Write JSON with multiple inputs in R在 R 中编写具有多个输入的 JSON
【发布时间】:2019-05-03 18:42:03
【问题描述】:

我有一个 tibble 和一个列表,我想将它们写入 json 文件。

# A tibble: 2 x 12
  i     n             c                  x      
  <chr> <chr>         <chr>              <chr>  
1 NYC   New York City United States      LON,271;BOS,201
2 LON   London        United Kingdom     NYC,270

我想用列表替换“x”列。

当我尝试将“i”列与列表元素合并时,大量数据重复...:/

样品清单:

$NYC
     d   p
1: LON 271
2: BOS 201

$LON
     d   p
1: NYC 270

我想最终得到这样的东西:

[
  {
    "i": "NYC",
    "n": "New York City",
    "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": "LON",
              "p": 271
          },
          {
              "d": "BOS",
              "p": 201
          }]
}
  ...
]

我在想应该有一种方法可以在不合并列表和小标题的情况下编写 json 文件,或者有一种方法可以将它们合并到 ragged way 中?

啊。我只是有了另一个想法。也许我可以将我的数据框转换为列表,然后使用 Reduce 组合列表...

http://www.sharecsv.com/s/2e1dc764430c6fe746d2299f71879c2e/routes-before-split.csv

http://www.sharecsv.com/s/b114e2cc6236bd22b23298035fb7e042/tibble.csv


【问题讨论】:

  • 您可以添加dput 的小标题和列表吗?似乎也存在不一致:在您的预期输出中,ix、列表和x 列的值基本上没有共同点。
  • 我已经添加了前 100 行的 csv。我认为通过将两者拆分为列表d1_split &lt;- split(d1, d1$i) 我已经接近了,但我在组合它们时遇到了麻烦
  • 例如,列表中的$ZVK 应与包含ZVKi 列中的行匹配。我想删除 tibble 中的 x 列并将其替换为列表的内容以创建嵌套列表,以便我可以使用 toJSON 保存输出
  • @JuliusVainora 是 for 循环的唯一方法吗?
  • @JuliusVainora 哦,好吧。希望现在更清楚一点

标签: r list merge element to-json


【解决方案1】:

我们可能会做以下事情:

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
      }
    ]
  }
] 

【讨论】:

  • 这个解决方案效果很好!!非常有帮助的朱利叶斯。感谢您还包括基本的 R 等价物,这样我就可以了解它是如何工作的。
猜你喜欢
  • 2021-06-06
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多