2017-06-17 125 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解決方案。 –