首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从R中的数据帧生成深度嵌套的JSON

从R中的数据帧生成深度嵌套的JSON
EN

Stack Overflow用户
提问于 2016-07-08 03:37:39
回答 1查看 959关注 0票数 1

我正在寻找一个漂亮整洁的数据框架,并使用R将其转换为深度嵌套的JSON。到目前为止,我还没有找到任何其他资源来直接解决这一任务-大多数似乎都试图从另一个方向进行处理(取消嵌套JSON)。

这是我开始使用的数据框的一个小的虚拟版本。想象一下,一家公司向两个受众进行了一次调查,一个针对经理,另一个针对员工。这些调查有不同的问题集,具有不同的I,但许多问题重叠,我想比较两组之间的回答。最终目标是创建一个JSON,该JSON在正确的层次结构中匹配来自两个调查的部分is、问题is和选项is/文本。有些问题的子问题需要更深一层的嵌套,这就是我难以做到的。

代码语言:javascript
运行
复制
library(dplyr)
library(tidyr)
library(jsonlite)

dummyDF <- data_frame(sectionId = c(rep(1,9),rep(2,3)),
                      questionId = c(rep(1,3),rep(2,6),rep(3,3)),
                      subquestionId = c(rep(NA,3),rep("2a",3),rep("2b",3),rep(NA,3)),
                      deptManagerQId = c(rep("m1",3),rep("m2",3),rep("m3",3),rep("m4",3)),
                      deptEmployeeQId = c(rep("e1",3),rep("e3",3),rep("e4",3),rep("e7",3)),
                      optionId = rep(c(1,2,3),4),
                      text = rep(c("yes","neutral","no"),4))

这是我想要达到的最终结果:

代码语言:javascript
运行
复制
theGoal <- fromJSON('{
  "sections": [
    {
      "sectionId": "1",
      "questions": [
        {
          "questionId": "1",
          "deptManagerQId": "m1",
          "deptEmployeeQId": "e1",
          "options": [
            {
              "optionId": 1,
              "text": "yes"
            },
            {
              "optionId": 2,
              "text": "neutral"
            },
            {
              "optionId": 3,
              "text": "no"
            }
          ]
        },
        {
          "questionId": "2",
          "options": [
            {
              "optionId": 1,
              "text": "yes"
            },
            {
              "optionId": 2,
              "text": "neutral"
            },
            {
              "optionId": 3,
              "text": "no"
            }
          ],
          "subquestions": [
            {
              "subquestionId": "2a",
              "deptManagerQId": "m2",
              "deptEmployeeQId": "e3"
            },
            {
              "subquestionId": "2b",
              "deptManagerQId": "m3",
              "deptEmployeeQId": "e4"
            }
          ]
        },
        {
          "questionId": "3",
          "deptManagerQId": "m4",
          "deptEmployeeQId": "e7",
          "options": [
            {
              "optionId": 1,
              "text": "yes"
            },
            {
              "optionId": 2,
              "text": "neutral"
            },
            {
              "optionId": 3,
              "text": "no"
            }
          ]
        }
      ]
    }
  ]
}')

下面是我在tidyr中尝试使用nest的几种方法,它们要么只完成了部分工作,要么抛出了错误消息。

1

代码语言:javascript
运行
复制
list1 <- dummyDF %>% nest(-sectionId, .key=questions) %>% 
  mutate(questions = lapply(seq_along(.$questions), function(x) nest(.$questions[[x]], optionId, text, .key = options))) %>%
  list(sections = .)

2

代码语言:javascript
运行
复制
nested1 <- dummyDF %>% nest(-sectionId, .key=questions) %>% 
  mutate(questions = lapply(seq_along(.$questions), function(x) nest(.$questions[[x]], optionId, text, .key = options)))

nested2 <- nested1 %>% mutate(questions = lapply(seq_along(.$questions), function(x) nest(.$questions[[x]], subquestionId, .key = subquestions))) 
#Gives this error: cannot group column options, of class 'list'

3.

代码语言:javascript
运行
复制
list2 <- dummyDF %>% nest(-sectionId, .key=questions) %>% 
  mutate(questions = lapply(seq_along(.$questions), 
                            function(x) {ifelse(is.na(.$questions[[x]]$subquestionId),
                                                function(x) {.$questions[[x]] %>% select(-subquestionId) %>% nest(optionId, text, .key = options)},
                                                function(x) {.$questions[[x]] %>% nest(subquestion_id, .key = subquestions)})})) %>% 
  list(sections = .) 
#Gives this error: attempt to replicate an object of type 'closure'

任何想法都将不胜感激。我对任何方法都持开放态度。我把这个问题带到了当地的一个R用户小组聚会上,但没有提出任何解决方案,所以我只能在这里祈祷了。我意识到R可能不是完成此任务的最佳工具,但它是我知道的工具,所以我正在尝试它。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-04-27 11:14:22

jsonlite::toJSON看起来是一个很好的问题解决方案。

可以无缝地处理列类型和列顺序(我进行了更正,以说明对象是相同的)。如果您需要任何其他类型的JSON结构,我建议您首先使用dplyrtidyr之类的东西在前端重新构建data_frame。

代码语言:javascript
运行
复制
library(jsonlite)
library(dplyr)

dummyDF <- data_frame(sectionId = c(rep(1,9),rep(2,3)),
                  questionId = c(rep(1,3),rep(2,6),rep(3,3)),
                  subquestionId = c(rep(NA,3),rep("2a",3),rep("2b",3),rep(NA,3)),
                  deptManagerQId = c(rep("m1",3),rep("m2",3),rep("m3",3),rep("m4",3)),
                  deptEmployeeQId = c(rep("e1",3),rep("e3",3),rep("e4",3),rep("e7",3)),
                  optionId = rep(c(1,2,3),4),
                  text = rep(c("yes","neutral","no"),4))

## Convert to a JSON object
json <- jsonlite::toJSON(dummyDF)


theGoal <- fromJSON(json) %>% tbl_df() %>% select_(.dots=names(dummyDF)) %>%
  ## Convert integer columns to numeric
  mutate_if(function(x) {if (typeof(x)=='integer') {TRUE} else {FALSE}},as.numeric)

## Compare the objects
all.equal(theGoal,dummyDF)
# TRUE

identical(theGoal,dummyDF)
# TRUE
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38253938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档