将Json数组键转换为csv列名和值

时间:2017-06-17 23:01:05

标签: json r dplyr

我正在解析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))

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

1 个答案:

答案 0 :(得分: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