将嵌套JSON文件转换为R数据帧

将嵌套JSON文件转换为R数据帧,r,json,dataframe,R,Json,Dataframe,我正试图将一个具有多级嵌套的JSON文件转换为R中的数据帧。我已经查看了一些关于这个问题的现有问题/答案(例如and),但由于这是我第一次处理JSON文件,我真的很挣扎 JSON文件相当大,包含twitter数据。下面是一个示例,演示嵌套结构的情况: [ { "Corpus": "ALM", "Tweets": [ { "tweet_id": "521033092132503552", "tweet_text": "

我正试图将一个具有多级嵌套的JSON文件转换为R中的数据帧。我已经查看了一些关于这个问题的现有问题/答案(例如and),但由于这是我第一次处理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"
                }
            ]
        },
这是同一个数据文件的一些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 &amp; acts of civ… Wed Nov 26 18:57… annotato… subversion   
6 537681598989… Wholeheartedly support these protests &amp; acts of civ… Wed Nov 26 18:57… annotato… subversion   
7 537681598989… Wholeheartedly support these protests &amp; acts of civ… Wed Nov 26 18:57… annotato… loyalty      
8 537681598989… Wholeheartedly support these protests &amp; 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吗