2016-02-08 17 views
0

我正在解析包含多個帳戶的API信息的JSON。這些數據用在api包裝器中。R - 過濾嵌套列表並找回更高級別的密鑰

[ 
    { 
     "geo":"au", 
     "api": [ 
      {"type":"base_url", "value":"https://api.com"}, 
      {"type":"key", "value":"f18"}, 
      {"type":"secret", "value":"569"} 
     ], 
     "accounts": [ 
      {"name":"client_AQE","id":"8765","inventory":"all","currency":"AUD"} 
     ] 
    },{ 
     "geo":"eu", 
     "api": [ 
      {"type":"base_url", "value":"https://api.com"}, 
      {"type":"key", "value":"p8c6043"}, 
      {"type":"secret", "value":"983df5"} 
     ], 
     "accounts": [ 
      {"name":"client_UYT","id":"098765","inventory":"all","currency":"GBP"}, 
      {"name":"client_WER","id":"09098","inventory":"all","currency":"GBP"}, 
      {"name":"client_OIP","id":"234543","inventory":"all","currency":"EUR"} 
     ] 
    } 
] 

當用戶給我一個「帳戶名」,但不指定「地理」,我想:

  1. 檢查客戶端只出現一次(這是可以做到與下面的功能,採用rlist
only_one_client <- function(account_name) { 
    return(fromJSON(file=API_INFO_PATH) %>% 
      list.map(accounts) %>% 
      unlist(recursive=F) %>% 
      list.mapv(name) %>% table() %>% extract(account_name) == 1)) 
} 
  • 如果客戶只出現了一次,發現了「地理」,它出現在
  • 這是我無法找到一個方法來做到

    回答

    1

    您可以將您的JSON成數據框保持各賬戶名稱和對應的地理,如果datafromJSON(file=API_INFO_PATH)你的結果,你可以這樣做:

    res <- as.data.frame(do.call(rbind,lapply(data,function(x) cbind(x[["geo"]],do.call(rbind,x[["accounts"]]))))) 
    colnames(res) <- c("geo",colnames(res[,-1])) 
    
    res <- merge(res,as.data.frame(table(res$name)),by.x="name",by.y="Var1") 
    
    #  name geo  id inventory currency Freq 
    #1 client_AQE au 8765  all  AUD 1 
    #2 client_OIP eu 234543  all  EUR 1 
    #3 client_UYT eu 098765  all  GBP 1 
    #4 client_WER eu 09098  all  GBP 1 
    

    這基本上遍歷列表,rbind所有帳戶,並將geo添加到每一行。

    然後,您可以使用table與您的功能一樣來檢查name出現的次數以及來自哪個geo