我正在解析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))
但是这显示了一个学生的多行。我需要显示每个主题的单行并将得分作为列值。
答案 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