【问题标题】:Convert Json array key's as csv column name and values将 Json 数组键转换为 csv 列名和值
【发布时间】:2017-06-17 23:01:05
【问题描述】:

我正在解析一个 json 数据来编写一个 csv 文件。我正在使用 tidyjson 包来完成这项工作。

在某些时候,我需要将下面的所有主题值打印在单独的列中,并将分数作为一个值。意思是物理,数学将是一个列名,分数将是一个值。

{
  "results": {
    "subjects": [
      {
        "subject": {
          "name": "Physics",
          "code": "PHY"
        },
        "score": 70
      },
      {
        "subject": {
          "name": "Mathematics",
          "code": "MATH"
        },
        "score": 50
      }
    ]
  }
}

我试过如下:

json_data %>%
  as.tbl_json %>%
  gather_array %>%
  spread_values(user_id = jstring("user_id")) %>%
  enter_object("results") %>%
  enter_object("subjects") %>%
  gather_array("subjects") %>%
  spread_values(score = jstring("score")) %>%
  enter_object("subject") %>%
  spread_values(subject = jstring("subject")) %>%
  mutate(Physics = case_when(.$name == "Physics" ~ score)) %>%
  mutate(Mathematics = case_when(.$name == "Mathematics" ~ score))

但这会为一个学生显示多行。我需要显示每个主题的单行并将得分作为列值。

【问题讨论】:

  • 您的示例 JSON 在语法上无效。您是否介意运行 dput(json_data) 并包括在内,以便其他用户可以重现您的示例?
  • “json”已被修复,但所需输出的示例将帮助人们帮助您。 jsonlite::fromJSON(jsontxt) 制作了一个很好的嵌套数据框架结构,可以轻松地与 dplyr 和 purrr 一起使用
  • 谢谢@hrbrmstr!提供的 JSON 不包括“user_id”或任何表明记录属于单个学生的内容。需要一个更完整的例子。
  • 抱歉@steven 请忽略“user_id”键。在这个 json 数据中,我有超过 500 个键,这就是我刚刚包含这部分的原因。

标签: json r dplyr


【解决方案1】:

但这会为一名学生显示多行。我需要显示每个主题的单行并将得分作为列值。

也就是说,您需要一个基于主题名称的唯一行吗?在这种情况下,您可以使用aggregate

如果你有一个名为df的数据框,

subject <- c("phy", "math", "phy", "math")
Score <- c(10, NA, NA, 20)
df <- data.frame(subject, Score)

那么,

aggregate(x=df[c("Score")], by=list(subjectName=df$subject), max, na.rm = TRUE)

输出

subjectName Score
    phy       10
    math      20

【讨论】:

  • 感谢@Emu,这解决了我的部分问题。我也在寻找一些 tidyjson 解决方案。
猜你喜欢
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2020-01-06
  • 1970-01-01
相关资源
最近更新 更多