我有一个JSON文件,我想把它转换成一个表。使用jsonlite
库很容易。但是,如果文件很大,那么转换需要大量的时间。所以我正在测试一个tidyjson
,希望能加速这个过程。
我的JSON文件如下所示:
x = '[
{
"id": 1,
"A": [
{
"B": "b1",
"C": [
"c1"
]
}
]
},
{
"id": 2,
"A": [
{
"B": "b1",
"C": [
"c2"
]
}
]
}
]
'
我就是这么处理的:
library(tidyjson)
library(dplyr)
x %>% gather_array() %>%
spread_values(id = jstring("id")) %>%
enter_object("A") %>% gather_array %>%
spread_values(B = jstring("B")) %>%
enter_object("C") %>% gather_array() %>%
spread_values(C = jstring("C")) %>%
select(id, B, C)
我得到的结果是:
..JSON id B C
<chr> <chr> <chr> <chr>
1 "\"c1\"" 1 b1 NA
2 "\"c2\"" 2 b1 NA
无法找出代码的错误所在,以及为什么它对C不起作用。任何帮助都是非常感谢的。
更新:预期输出:
id B C
<chr> <chr> <chr>
1 1 b1 c1
2 2 b1 c2
更新2: jsonlite
way:
y = jsonlite::fromJSON(x)
cbind(id = y$id, do.call(rbind.data.frame, y$A))
id B C
1 1 b1 c1
2 2 b1 c2
不确定在这种情况下它是否是使用jsonlite
最快的方式。
发布于 2021-09-15 08:56:59
我们可以使用来自fromJSON
的jsonlite
library(jsonlite)
library(tidyr)
library(dplyr)
fromJSON(x) %>%
unnest_wider(A) %>%
unnest(C) %>%
unnest(C)
-output
# A tibble: 2 x 3
id B C
<int> <chr> <chr>
1 1 b1 c1
2 2 b1 c2
或者另一个选择是
library(reticulate)
library(rrapply)
py_run_string(paste0("x = ", x))
rrapply(py$x, how = 'bind')
A.1.C A.1.B id
1 c1 b1 1
2 c2 b1 2
https://stackoverflow.com/questions/69196967
复制