json - rjson::fromJSON 只返回第一项

标签 json r database sqlite rjson

我有一个包含多个列的 sqlite 数据库文件。其中一列中嵌入了一个 JSON 字典(带有两个键)。我想将 JSON 列提取到 R 中的数据框中,在单独的列中显示每个键。

我试过 rjson::fromJSON,但它只读取第一项。有没有我想念的把戏?

这是一个模仿我的问题的例子:

> eg <- as.vector(c("{\"3x\": 20, \"6y\": 23}", "{\"3x\": 60, \"6y\": 50}"))
> fromJSON(eg)

$3x [1] 20

$6岁 [1] 23

期望的输出是这样的:

# a data frame for both variables
  3x 6y
1 20 23
2 60 50

或者,

# a data frame for each variable
  3x 
1 20
2 60

  6y
1 23
2 50

最佳答案

您要查找的实际上是 lapplyrbind 或相关应用程序的组合。

我将稍微扩展您的数据,使其包含 2 个以上的元素。

eg <- c("{\"3x\": 20, \"6y\": 23}",
        "{\"3x\": 60, \"6y\": 50}",
        "{\"3x\": 99, \"6y\": 72}")

library(jsonlite)

使用 base R,我们可以做到

do.call(rbind.data.frame, lapply(eg, fromJSON))
#   X3x X6y
# 1  20  23
# 2  60  50
# 3  99  72

你可能想做类似Reduce(rbind, lapply(eg, fromJSON))的事情,但显着的区别是在Reduce模型中,rbind 被调用"N-1"次,其中"N"是eg 中元素的数量;这会导致大量数据复制,虽然它可能适用于较小的“N”,但它的扩展性非常糟糕。使用 do.call 选项,rbind 只被调用一次。

请注意,列标签已被 R 化,因为 data.frame 列名称不应以数字开头。 (这是可能的,但通常不鼓励。)

如果您确信所有子字符串都将具有完全相同的元素,那么您在这里可能会做得很好。如果有可能在某个时候会有所不同,也许

eg <- c(eg, "{\"3x\": 99}")

然后您会注意到基本 R 解决方案在默认情况下不再有效。

do.call(rbind.data.frame, lapply(eg, fromJSON))
# Error in (function (..., deparse.level = 1, make.row.names = TRUE, stringsAsFactors = default.stringsAsFactors())  : 
#   numbers of columns of arguments do not match

可能有一些技术可以尝试规范化元素,这样您就可以确保匹配。但是,如果您不反对 tidyverse 包:

library(dplyr)
eg2 <- bind_rows(lapply(eg, fromJSON))
eg2
# # A tibble: 4 × 2
#    `3x`  `6y`
#   <int> <int>
# 1    20    23
# 2    60    50
# 3    99    72
# 4    99    NA

虽然您不能直接使用美元方法调用它,但您仍然可以使用 [[ 或反引号。

eg2$3x
# Error: unexpected numeric constant in "eg2$3"
eg2[["3x"]]
# [1] 20 60 99 99
eg2$`3x`
# [1] 20 60 99 99

关于json - rjson::fromJSON 只返回第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48797079/

相关文章:

jquery - 将 JSON 与 ASP.NET VB 结合使用

ajax - AngularJs - JSON 帖子

database - 我应该将我的单用户 MS Access 数据库拆分为前端/后端吗

sql - 数据库架构 : Why not create new table for each 'entity' ?

mysql - 如何区分数据库表中的行?

objective-c - 将 JSON 日期(刻度)转换为 NSDate

r - 关于如何通过 R 访问谷歌网站管理员工具的 api 的建议?

R排序数据子集

css - 根据书籍颜色主题自定义具有背景颜色的 block

javascript - 从页面回调获取JSON数据