2

世界銀行のデータベースからダウンロードした一部のデータを再形成する必要があります。しかし、私はそれにいくつかの問題があります。

目標は、次のようになることです。

year CH DE US
1980 17383.38 11746.40 12179.56
1981 15833.74 9879.46 13526.19
1982 16133.97 9593.66 13932.68
1983 16007.82 9545.86 15000.09
1984 15229.82 9012.48 16539.38

次のコードを使用してデータをダウンロードします。WDI および RJSONO パッケージが必要です。

wdi <-  WDI(country = c("CH","DE","US"), indicator = "NY.GDP.PCAP.CD" ,start = 1980, end = 2010, extra = F)

次に、次の方法で形状を変更しました。

wdi2 <- reshape(wdi, direction = "wide", timevar="year", v.names="NY.GDP.PCAP.CD", idvar="country", drop="iso2c")

出力は、それがどのように見えるべきかについての私の期待と一致しません:

> wdi2
             country NY.GDP.PCAP.CD.2010 NY.GDP.PCAP.CD.2009 NY.GDP.PCAP.CD.2008
    1    Switzerland            70572.66            65790.07            68555.37
    32       Germany            40163.82            40275.25            44132.04
    63 United States            46615.51            45305.05            46759.56 ...

これは少し良いですが、それでも私が望むものではありません:

> t(wdi2) 
                    1             32          63             
country             "Switzerland" "Germany"   "United States"
NY.GDP.PCAP.CD.2010 "70572.66"    "40163.82"  "46615.51"     
NY.GDP.PCAP.CD.2009 "65790.07"    "40275.25"  "45305.05"     
NY.GDP.PCAP.CD.2008 "68555.37"    "44132.04"  "46759.56"     
NY.GDP.PCAP.CD.2007 "59663.77"    "40402.99"  "46349.12" 

wdi オブジェクトは次のようになります。

> wdi
   iso2c       country NY.GDP.PCAP.CD year
1     CH   Switzerland      70572.657 2010
2     CH   Switzerland      65790.067 2009
3     CH   Switzerland      68555.372 2008
4     CH   Switzerland      59663.770 2007
...
30    CH   Switzerland      16219.906 1981
31    CH   Switzerland      17807.340 1980
32    DE       Germany      40163.817 2010
33    DE       Germany      40275.251 2009
34    DE       Germany      44132.042 2008
...
62    DE       Germany      11746.404 1980
63    US United States      46615.511 2010
64    US United States      45305.052 2009
4

3 に答える 3

3

またパソコンの前で…更新です。

私のコメントで述べたように、dcast「reshape2」からは非常に便利です。xtabs再形成ステップを実行しているだけであれば、ベース Rから同様の機能を得ることができます。

x <- xtabs(NY.GDP.PCAP.CD ~ year + iso2c, wdi)
head(x)
#       iso2c
# year         CH        DE       US
#   1980 17807.34 11746.404 12179.56
#   1981 16219.91  9879.457 13526.19
#   1982 16527.46  9593.657 13932.68
#   1983 16398.24  9545.859 15000.09
#   1984 15601.26  9012.479 16539.38
#   1985 15748.95  9125.121 17588.81

xtabsmatrixclass「xtab」のを作成するため、 を取得するdata.frameには、出力を でラップしますas.data.frame.matrix

head(as.data.frame.matrix(x))
#            CH        DE       US
# 1980 17807.34 11746.404 12179.56
# 1981 16219.91  9879.457 13526.19
# 1982 16527.46  9593.657 13932.68
# 1983 16398.24  9545.859 15000.09
# 1984 15601.26  9012.479 16539.38
# 1985 15748.95  9125.121 17588.81

コメントで尋ねた他の質問に答えるには:ただし、 reshape 関数のみを使用してデータを適切な形式に直接配置するよりスマートな方法ではありませんか? . reshape答えは「はい。最初の試みで「idvar」と「timevar」に使用していたものを交換するだけです。」

y <- reshape(wdi[-2], direction = "wide", idvar="year", timevar="iso2c")
## Optional step to clean up the resulting names
names(y) <- gsub("NY.GDP.PCAP.CD.", "", names(y))
head(y)
#   year       CH       DE       US
# 1 2010 70572.66 40163.82 46615.51
# 2 2009 65790.07 40275.25 45305.05
# 3 2008 68555.37 44132.04 46759.56
# 4 2007 59663.77 40402.99 46349.12
# 5 2006 54140.50 35237.60 44622.64
# 6 2005 51734.30 33542.78 42516.39

関数を使用する場合reshape、引数名の「id」と「time」の部分を無視して、代わりにそれらがどこに行くかを考えると役立つ場合があります。ID 変数は通常 1 つの列を構成し、時間変数は通常、時間ごとに 1 つの列で広く広がります。そのため、「国」を実際の ID 変数と考えているかもしれませんが、必要なデータ形式については、より時間変数です。

すでに回答を受け入れているにもかかわらず、これが役立つことを願っています:)

于 2013-10-06T17:36:25.713 に答える
3

を使用して実現するのは非常に簡単reshape2です。

require(reshape2)
dcast(wdi[,-2], year ~ iso2c, value.var = 'NY.GDP.PCAP.CD')

編集。おっと、Ananda Mahto が同じ解決策で投稿したコメントは見当たりませんでした。アナンド、コメントを回答として投稿すると、私のコメントは削除されます。

于 2013-10-06T12:43:15.767 に答える