繁体   English   中英

在转换为data.frame之前对R中的JSON字符串进行操作

[英]Manipulation of JSON string in R before conversion to data.frame

我有一个URL,它会定期用一些JSON数据更新,我想使用以下代码将其转换为R中的数据表

library(jsonlite)
fromJSON("http://...")

但是,这不起作用,我认为这是由于JSON的结构方式所致。 据我了解,该文件的当前结构如下。

{"h1":[{"h2":[{"Name":"Column1Header","Value":"Row1Column1Value"},{"Name":"Column2Header","Value":"Row1Column2Value"}]},{"h2":[{"Name":"Column1Header","Value":"Row2Column1Value"},{"Name":"Column2Header","Value":"Row2Column2Value"}]}]}

我想如果我可以将url作为一个长字符串读取并将其操纵为类似于下面的内容,然后调用该函数

fromJSON()

我将能够获取所需的data.table。

[{"Column1Header":"Row1Column1Value","Column2Header":"Row1Column2Value"},{"Column1Header":"Row2Column1Value","Column2Header":"Row2Column2Value"}]

知道我该如何实现吗? 我试图解决此问题的方法包括使用readLines()函数和使用gsub()替换我不需要的位。 但是, readLines在所有遇到麻烦的数据中放置了“ \\”,即使我过去了,我的gsub方法也不是很可靠。

由于现在正在读取文件,因此任何帮助将不胜感激,因为它不能让我进入提取构建“ data.table ”所需的“名称,值”对所需的详细data.table

ps某件事告诉我,由于某些原因,原始JSON文件已转置,因为列名不一定符合导出系统命名约定。

您需要查看这篇帖子,其中有29个赞:

不公开JSON的一种方法

您的JSON在结构上有效。 因此,问题在于当它现在具有非矩形形状时,将其不列出保存在矩形中。

如果可以,请从上方将JSON剪切并粘贴到此处的验证器: JSON Viewer

...您会看到H1涵盖了许多帧,H2涵盖了几帧,并且它们都是嵌套的。

为了在数据框中使用此功能,您需要取消嵌套(取消列出键:值对的列表),并将每层数据分配给一列。

上面的帖子有一个坚如磐石的方法,可以使用RJSONIO包快速,轻松地完成RJSONIO还有一个与unlist结合使用的apply方法。 您应该可以对此进行调整以解开数据!

就像是:

library(jsonlite)
library(purrr)

x <- '{"h1":[{"h2":[{"Name":"Column1Header","Value":"Row1Column1Value"},{"Name":"Column2Header","Value":"Row1Column2Value"}]},{"h2":[{"Name":"Column1Header","Value":"Row2Column1Value"},{"Name":"Column2Header","Value":"Row2Column2Value"}]}]}'

res <- fromJSON(x, simplifyVector=FALSE)

map(res$h1, "h2") %>%
  map(unlist) %>%
  map_df(function(x) {
    y <- names(x)
    nam <- which(grepl("Name", y))
    val <- which(!grepl("Name", y))
    setNames(as.list(x[val]), x[nam])
  })
## # A tibble: 2 × 2
##      Column1Header    Column2Header
##              <chr>            <chr>
## 1 Row1Column1Value Row1Column2Value
## 2 Row2Column1Value Row2Column2Value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM