2017-08-27 15 views
0

我在R中使用tidyjson將json轉換爲數據框架。我不能再回到以前的水平/對象無法返回到tidyjson的上一級別/對象

"ShipmentID" : 0031632569, "ShipmentType" : Cross-border, "ShipmentStatus" : Final, "PartyInfo" : -[ -{ "Type" : Consignee, "Code" : 0590000001, "Name" : HP Inc. C/O XPOLogistics, "Address" : -{ "AddressLine" : -[ 4000 Technology Court ] }, "City" : -{ "CityName" : Sandston, "CityCode" : -[ -{ "value" : USSAX, "Qualifier" : UN } ], "State" : VA, "CountryCode" : US, "CountryName" : United States } 
+0

請閱讀[如何提出一個好問題](http://stackoverflow.com/help/how-to-ask)以及如何給[reprod可以示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610)。這會讓其他人更容易幫助你。 – Jaap

回答

0

與@Jaap同意你的問題可以使用一些工作,以使其他用戶和那些幫助你更有幫助。無論如何,這是tidyjson的一個經常性問題。查看我們希望很快提交給CRAN的更新文檔here。特別是關於this issue的討論可能會有所幫助。這是一個肯定需要改進的問題(以及spread_values /等的詳細程度)(spread_all是新版本中的一種替代方案,但目前它已被破壞了dplyr> 0.7)

如果您想要要使用開發版的tidyjson,試試devtools::install_github('jeremystan/tidyjson')。無論如何,我認爲你提供的問題有一個可行的解決方案。你的JSON是無效的,所以我花了一些自由來清理它。 JSON結構

library(tidyjson) 
library(dplyr) 

raw_json <- "{\"ShipmentID\" : \"0031632569\", \"ShipmentType\" : \"Cross-border\", \"ShipmentStatus\" : \"Final\", \"PartyInfo\" : [{ \"Type\" : \"Consignee\", \"Code\" : \"0590000001\", \"Name\" : \"HP Inc. C/O XPOLogistics\", \"Address\": { \"AddressLine\" : [ \"4000 Technology Court\" ] }, \"City\" : { \"CityName\" : \"Sandston\", \"CityCode\" : [ { \"value\" : \"USSAX\", \"Qualifier\" : \"UN\" } ], \"State\" : \"VA\", \"CountryCode\" : \"US\", \"CountryName\" : \"United States\" }}]}" 

prep <- raw_json %>% 
    spread_values(
    ShipmentID = jstring(ShipmentID) 
    , ShipmentType = jstring(ShipmentType) 
    , ShipmentStatus = jstring(ShipmentStatus)) %>% 
    enter_object("PartyInfo") %>% 
    gather_array("PartyInfoID") %>% 
    spread_values(
    Type = jstring(Type) 
    , Code = jstring(Code) 
    , Name = jstring(Name) 
    , CityName = jstring(City, CityName) 
    , CityState = jstring(City, State) 
    , CityCountryCode = jstring(City, CountryCode) 
    , CityCountryName = jstring(City, CountryName) 
) 

addressline <- prep %>% 
    enter_object(Address, AddressLine) %>% 
    gather_array("AddressLineID") %>% 
    append_values_string("AddressLine") %>% 
    select(document.id, AddressLineID, AddressLine) 

citycode <- prep %>% 
    enter_object(City, CityCode) %>% 
    gather_array("CityCodeID") %>% 
    spread_values(
     CityCode = jstring(value) 
     , CityCodeQualifier = jstring(Qualifier)) %>% 
    select(document.id, CityCodeID, CityCode, CityCodeQualifier) 

prep %>% 
    left_join(addressline, by = "document.id") %>% 
    left_join(citycode, by = "document.id") 
#> document.id ShipmentID ShipmentType ShipmentStatus PartyInfoID  Type 
#> 1   1 0031632569 Cross-border   Final   1 Consignee 
#>   Code      Name CityName CityState CityCountryCode 
#> 1 0590000001 HP Inc. C/O XPOLogistics Sandston  VA    US 
#> CityCountryName AddressLineID   AddressLine CityCodeID CityCode 
#> 1 United States    1 4000 Technology Court   1 USSAX 
#> CityCodeQualifier 
#> 1    UN 
相關問題