Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
rjson::fromJSON只返回第一项_Json_R_Database_Sqlite_Rjson - Fatal编程技术网

rjson::fromJSON只返回第一项

rjson::fromJSON只返回第一项,json,r,database,sqlite,rjson,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) 或者 您所寻找的

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

我尝试了rjson::fromJSON,但它只读取第一项。有没有我错过的把戏

下面是一个模拟我的问题的示例:

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


您所寻找的实际上是
lappy
rbind
或相关应用程序的组合

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

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

library(jsonlite)
您可能会尝试执行类似于
Reduce(rbind,lappy(例如fromJSON))
的操作,但显著的区别是在
Reduce
模型中,
rbind
被称为“N-1”次,其中“N”是
eg
中的元素数;这会导致大量的数据复制,尽管它可以在小“N”下正常工作,但它的伸缩性非常差。使用
do.call
选项,
rbind
只被调用一次

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

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

eg <- c(eg, "{\"3x\": 99}")
可能有一些技术尝试规范化元素,以便确保匹配。但是,如果您不反对使用
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

对我来说不一样;我得到了
解析错误:拖尾垃圾
,就好像它在串接字符串一样。不管怎样,你期待什么?您正在寻找
lappy(例如,fromJSON)
?(如果有必要的话,我正在使用
jsonlite-1.5
)谢谢@r2evans,jsonlite给了我和你一样的错误,rjson没有。我尝试了lappy,但它生成的列表数量与项目数量相同。我的目标是每个键都有一个列表,一个是“1x”,一个是“5y”。这是完全不同的。。。您需要编辑问题并插入所需的输出。答案可能从我的
lappy
suggest开始,然后使用
Reduce
可能会有用。(很抱歉,我错过了你问题中的
rjson::
,我的错。)谢谢@r2evans,添加了所需的输出。我将检查reduce(),我认为paste()也可以这样做。我试试看。非常感谢。第一种方法非常有效。如果这回答了您的问题,请选择左侧的复选标记“接受”。像这样接受它有两个作用:它提供了结束语,以便将来阅读您的问题的人理解已接受/首选的解决方案;它还以名誉的形式为答案提供了一点“谢谢”。(我更关注前者,虽然我不寻求分数,但它们也没有伤害:-)完成!非常感谢您的回答,并告诉我如何接受答案:)
do.call(rbind.data.frame, lapply(eg, fromJSON))
#   X3x X6y
# 1  20  23
# 2  60  50
# 3  99  72
eg <- c(eg, "{\"3x\": 99}")
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
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