【问题标题】:Converting JSON to data frame with proper column names将 JSON 转换为具有正确列名的数据框
【发布时间】:2018-12-01 17:57:54
【问题描述】:

我正在尝试将下面的 json 转换为数据框:

data_toy.json = 
{
    "department": {
        "BME": [
            {
                "course_name": "BMD_ENG_250-0_20 Thermodynamics",
                "instructor": "Neha Kamat",
                "instructor_gender": "F"
            }
        ]
    }
}

但是,当我跑步时

library(jsonlite)
dat <- as.data.frame(fromJSON('data_toy.json'))

我明白了:

> str(dat)
'data.frame':   1 obs. of  3 variables:
 $ department.BME.course_name      : chr "BMD_ENG_250-0_20 Thermodynamics"
 $ department.BME.instructor       : chr "Neha Kamat"
 $ department.BME.instructor_gender: chr "F"

我该怎么做:

1) 为department添加一列?

2) 制作列:部门、课程名称、讲师、讲师性别?

【问题讨论】:

  • 可能是library(tidyverse); jsonlite::fromJSON(data_toy.json) %&gt;% pluck(1) %&gt;% imap_dfr(~mutate(.x, department = .y)),但是多行数据的reprex会更好
  • 这似乎适用于玩具示例。但是当我使用完整的json时,我得到Error in UseMethod("mutate_") : no applicable method for 'mutate_' applied to an object of class "character"
  • 就像我说的,我认为你的例子不足以代表你的问题。

标签: r json jsonlite


【解决方案1】:

我认为您需要发布更多数据,但是:

data_toy.json = '{"department": {"BME": [{"course_name": "BMD_ENG_250-0_20 Thermodynamics","instructor": "Neha Kamat","instructor_gender": "F"}]}}'

dat <- jsonlite::fromJSON(data_toy.json, simplifyVector = FALSE, simplifyDataFrame = FALSE, flatten=FALSE)

str(dat)
## List of 1
##  $ department:List of 1
##   ..$ BME:List of 1
##   .. ..$ :List of 3
##   .. .. ..$ course_name      : chr "BMD_ENG_250-0_20 Thermodynamics"
##   .. .. ..$ instructor       : chr "Neha Kamat"
##   .. .. ..$ instructor_gender: chr "F"

基础R:

do.call(
  rbind.data.frame,
  unname(lapply(dat, function(x) {

    tdf <- as.data.frame(x[[1]], stringsAsFactors=FALSE)
    tdf$department <- names(x)[1]
    tdf

  }))
)
##                       course_name instructor instructor_gender department
## 1 BMD_ENG_250-0_20 Thermodynamics Neha Kamat                 F        BME

如果你被困在 tidyverse:

library(purrr)

map_df(dat, ~{
  flatten_df(.x[[1]]) %>%
    dplyr::mutate(department = names(.x)[1])
})
## # A tibble: 1 x 4
##   course_name                     instructor instructor_gender department
##   <chr>                           <chr>      <chr>             <chr>     
## 1 BMD_ENG_250-0_20 Thermodynamics Neha Kamat F                 BME

【讨论】:

  • 对不起,我不得不出去几个小时。我会添加一个更好的 MWE。
  • 我收回了。我现在遇到一个新错误,我会发布一个新问题。
猜你喜欢
  • 1970-01-01
  • 2022-06-14
  • 2017-01-20
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 2020-05-31
  • 2020-05-15
相关资源
最近更新 更多