2016-10-03 9 views
-1

Rパッケージに含まれる関数の出力を再設計するには、いくつかの助けが必要です。Rフレームでデータフレームを再構成する

output_IMFDataというデータフレームの形を、の形に非常に似た形に再構成することができます。これらのデータフレームを再現MWEのコードがです:

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) 

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) 

ためoutput_IMFDataからの出力は次のようになります。

enter image description here

しかし、私が欲しいですこのデータフレームをoutput_imfrの出力のように再設計するには:

enter image description here

悲しいことに、私は、その先進的なユーザーではないですし、私を助けることができる何かを見つけることができませんでした。 output_IMFDataの形状を第2の ``パネルデータのような "データフレームワークの形状に変換する際の私の基本的な問題は、をoutput_IMFDataにどのように扱うべきかわからないことです。つまり、列番号@REF-AREAには国名のコードがあり、Obsの列にはそれぞれの時系列データがあります。これはパネルデータを扱う非常に面倒な方法であり、そのデータフレームをoutput_imfrデータフレームのはるかに良い形式

答えて

2

このデータは、Obsのリストに格納されています。データを分割してリストを開けます。一緒に物事をステッチしてください。

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

head(longData) 

ができます:

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

- 私はあなたの最初のコードを誤解し、それがローカルデータベースから呼び出し、および/または大型必要だと思いましたダウンロード(以前は 'imfr'パッケージを使ったことがありませんでした)。実際にあなたのために働くべきいくつかのコードについては、編集された記事を見てください( 'gather'は**これらのデータのために**働かないことに注意してください)。 –

+0

それは素晴らしいです。それは時間があれば多くを保存しました。これは私が知りたかったものです。 – msh855

+0

Pererson、少し歪んだと仮定し、1つのシリーズをダウンロードする代わりに2つをダウンロードしたいとします。このひねりのためのMWEは、 'CL_INDICATOR_IFS 'を' queryfilter'リストの 'CL_INDICATOR_IFS = c(" IAD_BP6_USD "、" NGDP_EUR ")として再定義することです。言い換えれば、対応は、@REF-AREAだけでなくインジケータ、すなわち「@指示子」にも基づいて行われるべきである。コードをどのように修正するべきかお勧めしますか? – msh855

2

は、ここに別のアプローチです:そのことについて申し訳ありません

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

これは非常に直感的でスマートな答えですが、データフレームが大きくなると非常に遅くなることがあります。 – msh855

関連する問題