2016-10-03 10 views
-1

Ich brauche etwas Hilfe, um die Ausgabe einer Funktion neu zu gestalten, die durch ein R-Paket kommt.Umformen eines Datenrahmens in R

Mein Ziel ist es, einen Datenrahmen namens output_IMFData auf eine Art und Weise zu gestalten, die der Form von output_imfr sehr ähnlich ist. Die Codes eines MWE diese Datenrahmen Reproduktion sind:

library(imfr) 

output_imfr <- imf_data(database_id="IFS", indicator="IAD_BP6_USD", country = "", start = 2010, end = 2014, freq = "A", return_raw =FALSE, print_url = T, times = 3) 

und für output_IMFData

library(IMFData) 
databaseID <- "IFS" 
startdate <- "2010" 
enddate  <- "2014" 
checkquery <- FALSE 
queryfilter <- list(CL_FREA = "A", CL_AREA_IFS = "", CL_INDICATOR_IFS = "IAD_BP6_USD") 
output_IMFData <- CompactDataMethod(databaseID, queryfilter, startdate, enddate, 
            checkquery) 

die Ausgabe von output_IMFData sieht wie folgt aus:

enter image description here

Aber, ich will Um diesen Datenrahmen so umzugestalten, dass er wie die Ausgabe von output_imfr aussieht:

enter image description here

Leider bin ich nicht, dass fortgeschrittene Benutzer und konnte nicht etwas finden, das mir helfen kann. Mein grundlegendes Problem bei der Umwandlung der Form von output_IMFData in die Form des zweiten "Panel-Daten-Looking" -Datenframework ist, dass ich nicht weiß, wie man die Obs in output_IMFData in einer Weise, die die "Korrespondenz" mit dem nicht verlieren kann Referenz Code @REF-AREA in output_IMFData Das heißt, in Spalte @REF-AREA gibt es Codes von Ländernamen und die Spalte in Obs hat ihre jeweiligen Zeitreihendaten.Dies ist sehr umständliche Art der Arbeit mit Panel-Daten, und deshalb möchte ich diesen Datenrahmen umformen die viel schöne Form output_imfr Datenrahmen.

Antwort

2

die Daten von Interesse sind Obs in einer Liste in der Spalte gespeichert. Hier ist eine dplyr Lösung, die Daten zu spalten, knackt die Liste, th Nähen Sie die Dinge wieder zusammen.

longData <- 
    output_IMFData %>% 
    split(1:nrow(.)) %>% 
    lapply(function(x){ 
    data.frame(
     iso2c = x[["@REF_AREA"]] 
     , x$Obs 
    ) 
    }) %>% 
    bind_rows() 

head(longData) 

gibt:

iso2c X.TIME_PERIOD  X.OBS_VALUE X.OBS_STATUS 
1 FJ   2010 47.2107721901621   <NA> 
2 FJ   2011   48.28347   <NA> 
3 FJ   2012 51.0823499999999   <NA> 
4 FJ   2013 157.015648875072   <NA> 
5 FJ   2014 186.623232882226   <NA> 
6 AW   2010 616.664804469274   <NA> 
+0

Tut mir leid - ich falsch verstanden Ihren ursprünglichen Code und dachte, dass es aus lokalen Datenbanken anrief und/oder erfordern große Downloads (Ich hatte das Paket 'imfr' vorher noch nie benutzt). Sehen Sie sich den bearbeiteten Post für Code an, der eigentlich für Sie funktionieren sollte (beachten Sie, dass "Sammeln" ** nicht ** für diese Daten funktioniert) –

+0

Das ist großartig. Es rettete viel Zeit. Das ist alles was ich wissen wollte. – msh855

+0

Pererson, nehme an, dass man eine kleine Wendung macht, und anstatt eine Serie herunterzuladen, möchte man zwei herunterladen. Ein MWE für diesen Twist wäre, den 'CL_INDICATOR_IFS 'als' CL_INDICATOR_IFS = c ("IAD_BP6_USD", "NGDP_EUR") in der 'queryfilter'-Liste neu zu definieren. Mit anderen Worten, die Korrespondenz sollte nicht nur auf @ REF-AREA basieren, sondern auch auf dem Indikator, d. H. "@ INDICATOR". Können Sie bitte vorschlagen, wie Ihr Code geändert werden sollte? – msh855

2

Hier ist ein weiterer Ansatz:

NewDataFrame <- data.frame(iso2c=character(), 
       year=numeric(), 
       IAD_BP6_USD=character(), 
       stringsAsFactors=FALSE) 

newrow = 1 

for(i in 1:nrow(output_IMFData)) { # for each row of your cludgy df 
    for(j in 1:length(output_IMFData$Obs[[i]]$`@TIME_PERIOD`)) { # for each year 
    NewDataFrame[newrow,'iso2c']<-output_IMFData[i, '@REF_AREA'] 
    NewDataFrame[newrow,'year']<-output_IMFData$Obs[[i]]$`@TIME_PERIOD`[j] 
    NewDataFrame[newrow,'IAD_BP6_USD']<-output_IMFData$Obs[[i]]$`@OBS_VALUE`[j] 
    newrow<-newrow + 1 # increment down a row 
    } 
} 
+1

Dies ist eine sehr intuitive und intelligente Antwort, sie kann jedoch sehr langsam werden, sobald der Datenrahmen groß wird. – msh855

Verwandte Themen