2017-06-17 48 views
2

我正在解析json数据来编写csv文件。我正在使用tidyjson包来完成这项工作。将json数组键转换为csv列名和值

在某些情况下,我需要在单独的列中打印下面的所有主题值,并将得分作为值。意义物理学,数学将是一个专栏名称,分数将会有价值。

{ 
    "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

您例如JSON在语法上不有效。你会介意运行'dput(json_data)'并且包含其他用户可以重现你的例子吗? –

+1

“json”已被修复,但是所需输出wld帮助人员可以帮助您。 'jsonlite :: fromJSON(jsontxt)'产生一个很好的嵌套数据帧结构,可以很容易地用dplyr&purrr – hrbrmstr

+0

Thanks @hrbrmstr!提供的JSON不包含“user_id”或任何可能表明记录属于单个学生的内容。需要一个更完整的例子。 –

回答

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 
+0

谢谢@Emu这已解决了我的部分问题。我也在寻找一些tidyjson解决方案。 –