我正在尝试将具有多个嵌套级别的JSON文件转换为R中的数据框。我已经查看了一些有关此问题的现有问题/答案(例如Convert JSON to R dataframe和Flatten nested JSON to dataframe in R和Nested JSON to dataframe in R),但是因为这是我第一次处理JSON文件,所以我真的很努力。
JSON文件很大,并且包含twitter数据。这是显示嵌套结构的示例:
[
{
"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"
}
]
},
以下是同一数据文件的一些内容,但观察结果/推文不同(请注意,因为文件太大,所以最大嵌套级别被切断了):
list(tweet_id = "500745903054258177", tweet_text = "@MichaelSkolnik Thank you for joining the solidarity effort #DearMikesMom #AllLivesMatter",
date = "Sat Aug 16 20:48:21 +0000 2014", annotations = list(
list(annotator = "annotator01", annotation = "loyalty"),
list(annotator = "annotator02", annotation = "loyalty"),
list(annotator = "annotator03", annotation = "loyalty"))),
list(tweet_id = "621859689270120448", tweet_text = "no tweet text available",
date = "no date available", annotations = list(list(annotator = "annotator01",
annotation = "betrayal"), list(annotator = "annotator02",
annotation = "non-moral"), list(annotator = "annotator03",
annotation = "fairness"))), list(tweet_id = "551227029874438145",
我想要的输出看起来像这样:
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
...
如何将JSON文件转换为所需的数据帧输出?
我已经导入了JSON文件,并尝试将其扁平化:
myData <- fromJSON(file = "my_json_file.json")
myData_flat <- as.data.frame(myData)
但这显然不够:
str(myData_flat)
'data.frame': 1 obs. of 352130 variables:
$ Corpus : Factor w/ 1 level "ALM": 1
$ Tweets.tweet_id : Factor w/ 1 level "521033092132503552": 1
$ Tweets.tweet_text : Factor w/ 1 level "no tweet text available": 1
$ Tweets.date : Factor w/ 1 level "no date available": 1
$ Tweets.annotations.annotator : Factor w/ 1 level "annotator00": 1
$ Tweets.annotations.annotation : Factor w/ 1 level "care": 1
$ Tweets.annotations.annotator.1 : Factor w/ 1 level "annotator01": 1
$ Tweets.annotations.annotation.1 : Factor w/ 1 level "care,purity": 1
$ Tweets.annotations.annotator.2 : Factor w/ 1 level "annotator02": 1
$ Tweets.annotations.annotation.2 : Factor w/ 1 level "care,purity": 1
$ Tweets.annotations.annotator.3 : Factor w/ 1 level "annotator03": 1
$ Tweets.annotations.annotation.3 : Factor w/ 1 level "care": 1
$ Tweets.tweet_id.1 : Factor w/ 1 level "537681598989475841": 1
$ Tweets.tweet_text.1 : Factor w/ 1 level "Wholeheartedly support these protests & acts of civil disobedience & will join when I can! #Ferguson #A"| __truncated__: 1
$ Tweets.date.1 : Factor w/ 1 level "Wed Nov 26 18:57:37 +0000 2014": 1
$ Tweets.annotations.annotator.4 : Factor w/ 1 level "annotator00": 1
$ Tweets.annotations.annotation.4 : Factor w/ 1 level "subversion": 1
$ Tweets.annotations.annotator.5 : Factor w/ 1 level "annotator01": 1
$ Tweets.annotations.annotation.5 : Factor w/ 1 level "subversion": 1
$ Tweets.annotations.annotator.6 : Factor w/ 1 level "annotator02": 1
$ Tweets.annotations.annotation.6 : Factor w/ 1 level "loyalty": 1
$ Tweets.annotations.annotator.7 : Factor w/ 1 level "annotator03": 1
$ Tweets.annotations.annotation.7 : Factor w/ 1 level "loyalty,subversion": 1
...
答案 0 :(得分:2)
R
中有多个软件包可以读取JSON数据并具有fromJSON()
功能。 RJSONOIO
,jsonlite
和rjson
是我所知道的。似乎您在代码中使用了rjson::fromJSON()
。
由于json
格式在存储数据方面非常灵活,并且能够存储复杂的嵌套结构,因此当我们将其转换为相对复杂的data.frame
格式时,对数据的结构非常明确。您的情况很简单,但是当转换为data.frame
的矩形形状时,要捕获json文件中的所有数据表示形式,可能会很繁琐。
rjson::fromJSON()
生成一个嵌套列表,该列表类似于JSON文件的结构。
您的myData
list
的结构如下:
myData[[1]]:
- $Corpus
- $Tweets
- $[[1]]
- tweet data
- $[[2]]
- tweet data
为了提取所需的数据,您想循环浏览mydata[[1]]$tweets
子列表的条目,将它们转换为data.frame
,然后将所有这些{{1 }}到一个大data.frame
。您可以使用data.frame
循环或类似for
的方法来做到这一点。我建议使用lapply()
,因为它会自动将每个嵌套操作的结果绑定到一个purrr::map_dfr()
中。
我发现以下内容适用于您的数据。幸运的是,data.frame
非常适合您的数据。您将其应用于每个tweet条目,然后将其应用于每组tibble::as.tibble()
,annotator
,您将获得想要的结果。
annotion