gpt4 book ai didi

json - 在 R 中展平深层嵌套的 json

转载 作者:行者123 更新时间:2023-12-05 07:51:25 25 4
gpt4 key购买 nike

我正在尝试使用 R 将嵌套的 JSON 文件转换为二维数据框。

我的 JSON 文件具有嵌套结构。但是,名称和属性在各个级别都是相同的。

{"name":"A", "value":"1", "c":
[{"name":"a1", "value":"11", "c":
[{"name":"a11", "value":"111"},
{"name":"a12", "value":"112"}]
},
{"name":"a2", "value":"12"}]
}

所需的数据集如下所示。尽管确切的列名称可能不同。

name    value   c__name c_value c_c_name    c_c_value
A 1 a1 11 a11 111
A 1 a1 11 a12 112
A 1 a2 12

我目前使用的代码将数据展平,但它似乎只适用于第一层(参见输出的屏幕截图)。

library(jsonlite)
json_file <- ' {"name":"A", "value":"1", "c":
[{"name":"a1", "value":"11", "c":
[{"name":"a11", "value":"111"},
{"name":"a12", "value":"112"}]
},
{"name":"a2", "value":"12"}]
}'

data <- fromJSON(json_file, flatten = TRUE)
View(data)

enter image description here

我尝试了多个包,包括 jsonlite 和 RJSONIO,我花了最后 5 个小时调试它并尝试了各种在线教程,但没有成功。感谢您的帮助!

最佳答案

首先,这是一些丑陋的 JSON;如果你有办法避免它,那就去做吧。因此,接下来的内容也非常丑陋——我通常不会发布它,但我现在这样做是希望其中的一些方法可能有用。如果它冒犯了你的眼睛,让我知道,我会删除它。

library(jsonlite)    # for fromJSON
library(reshape2) # for melt
library(dplyr) # for inner_join, select

jlist <- fromJSON(json_file)
jdf <- as.data.frame(jlist)
jdf$c.value <- as.numeric(jdf$c.value) # fix type
jdf$L1 <- as.integer(factor(jdf$c.name)) # for use as a key with an artifact of melt later *urg, sorry*
ccdf <- melt(jdf$c.c) # get nested list into usable form
names(ccdf)[1:2] <- c('c.c.name', 'c.c.value') # fix names so they won't cause problems with the join
df3 <- inner_join(jdf[, -5], ccdf) # join, take out nested column
df3$c.c.value <- as.numeric(df3$c.c.value) # fix type
df3 <- df3 %>% select(-L1, -c) # get rid of useless columns

留给你

> df3
name value c.name c.value c.c.name c.c.value
1 A 1 a1 11 a11 111
2 A 1 a1 11 a12 112
3 A 1 a2 12 <NA> NA

具有合理合理的类型。如果您愿意,可以避免使用包。

这是可扩展的吗?好吧,不是真的,没有更多同样的困惑。如果其他人有处理讨厌的 JSON 的不那么讨厌和更具可扩展性的方法,请张贴;我会和 OP 一样感激。

关于json - 在 R 中展平深层嵌套的 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35095230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com