【发布时间】: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 个键,这就是我刚刚包含这部分的原因。