将嵌套JSON文件转换为R数据帧
我正试图将一个具有多级嵌套的JSON文件转换为R中的数据帧。我已经查看了一些关于这个问题的现有问题/答案(例如and),但由于这是我第一次处理JSON文件,我真的很挣扎 JSON文件相当大,包含twitter数据。下面是一个示例,演示嵌套结构的情况:将嵌套JSON文件转换为R数据帧,r,json,dataframe,R,Json,Dataframe,我正试图将一个具有多级嵌套的JSON文件转换为R中的数据帧。我已经查看了一些关于这个问题的现有问题/答案(例如and),但由于这是我第一次处理JSON文件,我真的很挣扎 JSON文件相当大,包含twitter数据。下面是一个示例,演示嵌套结构的情况: [ { "Corpus": "ALM", "Tweets": [ { "tweet_id": "521033092132503552", "tweet_text": "
[
{
"Corpus": "ALM",
"Tweets": [
{
"tweet_id": "521033092132503552",
"tweet_text": "no tweet text available",
"date": "no date available",
"annotations": [
{
"annotator": "annotator00",
"annotation": "care"
},
{
"annotator": "annotator01",
"annotation": "care,purity"
},
{
"annotator": "annotator02",
"annotation": "care,purity"
},
{
"annotator": "annotator03",
"annotation": "care"
}
]
},
{
"tweet_id": "537681598989475841",
"tweet_text": "Wholeheartedly support these protests & acts of civil disobedience & will join when I can! #Ferguson #AllLivesMatter",
"date": "Wed Nov 26 18:57:37 +0000 2014",
"annotations": [
{
"annotator": "annotator00",
"annotation": "subversion"
},
{
"annotator": "annotator01",
"annotation": "subversion"
},
{
"annotator": "annotator02",
"annotation": "loyalty"
},
{
"annotator": "annotator03",
"annotation": "loyalty,subversion"
}
]
},
这是同一个数据文件的一些dput,但不同的观察结果/tweet(注意,由于文件太大,最大嵌套级别被切断):
我期望的输出如下所示:
corpus tweet_id tweet_text date annotator annotation
1 ALM 5210... no tweet text available no date available 00 care
2 ALM 5210... no tweet text available no date available 01 care, purity
3 ALM 5210... no tweet text available no date available 02 care, purity
4 ALM 5210... no tweet text available no date available 03 care
5 ALM 5376... Wholeheartedly suppo... Wed Nov 26 18:... 00 subversion
6 ALM 5376... Wholeheartedly suppo... Wed Nov 26 18:... 01 subversion
7 ALM 5376... Wholeheartedly suppo... Wed Nov 26 18:... 02 loyalty
8 ALM 5376... Wholeheartedly suppo... Wed Nov 26 18:... 03 loyalty, subversion
...
myData[[1]]:
- $Corpus
- $Tweets
- $[[1]]
- tweet data
- $[[2]]
- tweet data
如何将JSON文件转换为所需的数据帧输出
我已导入JSON文件,并尝试将其展平,如下所示:
myData <- fromJSON(file = "my_json_file.json")
myData_flat <- as.data.frame(myData)
R
中有几个包可以读入JSON数据并具有fromJSON()
函数RJSONIO
、jsonlite
和rjson
是我所知道的。似乎您在代码中使用了rjson::fromJSON()
由于json
格式在存储数据的方式上非常灵活,并且能够存储复杂的嵌套结构,因此当我们将其转换为data.frame
的相对不太复杂的格式时,我们必须非常明确地说明数据的结构。在转换为data.frame
的矩形形状时,捕获json文件中的全部数据表示形式非常简单,但可能非常繁琐
rjson::fromJSON()
生成一个嵌套列表,类似于JSON文件的结构
myData
列表的结构如下所示:
corpus tweet_id tweet_text date annotator annotation
1 ALM 5210... no tweet text available no date available 00 care
2 ALM 5210... no tweet text available no date available 01 care, purity
3 ALM 5210... no tweet text available no date available 02 care, purity
4 ALM 5210... no tweet text available no date available 03 care
5 ALM 5376... Wholeheartedly suppo... Wed Nov 26 18:... 00 subversion
6 ALM 5376... Wholeheartedly suppo... Wed Nov 26 18:... 01 subversion
7 ALM 5376... Wholeheartedly suppo... Wed Nov 26 18:... 02 loyalty
8 ALM 5376... Wholeheartedly suppo... Wed Nov 26 18:... 03 loyalty, subversion
...
myData[[1]]:
- $Corpus
- $Tweets
- $[[1]]
- tweet data
- $[[2]]
- tweet data
为了提取您正在查找的数据,您需要循环浏览mydata[[1]]$tweets子列表的条目,将它们转换为data.frame
,然后将所有这些data.frame
绑定到一个大的data.frame
。您可以使用for
循环或类似于lappy()
的东西来实现这一点。我建议使用purrr::map_dfr()
,因为它会自动将每个嵌套操作的结果绑定到一个data.frame
我发现以下内容适用于您的数据。幸运的是,tibble::as.tibble()
对您的数据很有效。您将其应用于每个tweet条目一次,然后将其应用于每一组注释器
,注释
,您将得到您要查找的结果
library(rjson)
myData <- fromJSON(file = "my_json_file.json")
library(purrr)
library(dplyr)
myData_df <- map_dfr(myData[[1]]$Tweets, as.tibble)
annotations_df <- map_dfr(myData_df$annotations, as.tibble)
myData_df %>%
select(-annotations) %>%
bind_cols(annotations_df)
># A tibble: 8 x 5
> tweet_id tweet_text date annotator annotation
<chr> <chr> <chr> <chr> <chr>
1 521033092132… no tweet text available no date available annotato… care
2 521033092132… no tweet text available no date available annotato… care,purity
3 521033092132… no tweet text available no date available annotato… care,purity
4 521033092132… no tweet text available no date available annotato… care
5 537681598989… Wholeheartedly support these protests & acts of civ… Wed Nov 26 18:57… annotato… subversion
6 537681598989… Wholeheartedly support these protests & acts of civ… Wed Nov 26 18:57… annotato… subversion
7 537681598989… Wholeheartedly support these protests & acts of civ… Wed Nov 26 18:57… annotato… loyalty
8 537681598989… Wholeheartedly support these protests & acts of civ… Wed Nov 26 18:57… annotato… loyalty,subv…
库(rjson)
myData#A tible:8 x 5
>tweet\u id tweet\u文本日期注释器注释
1 521033092132…无推文可用无日期可用注释…注意
2 521033092132…无推文可用无日期可用注释…注意,纯度
3 521033092132…无推文可用无日期可用注释…注意,纯度
4 521033092132…无推文可用无日期可用注释…注意
537681598989…全力支持这些抗议活动;文明行为…星期三11月26日18:57…注释…颠覆
6537681598989…全力支持这些抗议活动;文明行为…星期三11月26日18:57…注释…颠覆
7 537681598989…全力支持这些抗议活动;文明行为…星期三11月26日18:57…注释…忠诚
8537681598989…全力支持这些抗议活动;文明行为…星期三11月26日18:57…注释…忠诚,附属…
您可以发布示例的dput吗?您需要的是:在帖子中添加一部分dput吗