2016-10-06 8 views
0

簡潔にするために、私は、政府から援助を受けた組織をリストする、国レベルのデータセットを持っているとしましょう。その金額はどれくらいで、プロジェクトのタイプ。データフレームには毎年10団体の「スペース」がありますが、すべての政府が毎年多くの組織に補助金を出しているわけではないので、空白がたくさんあります。さらに、彼らはどんな順序にも従わない:1つの組織は1年目に、次の年は2番目の場所にコード化することができる。データは次のようになります。モナディックからダイアディックまでのデータをR

> State Year Org1 Aid1 Proj1 Org2 Aid2 Proj2 Org3 Aid3 Proj3 Org4 Aid4 Proj4 ... 
    Italy 2000 A 1000 Arts B 500 Arts C 300 Social 
    Italy 2001 B 700 Social A 1000 Envir 
    Italy 2002 A 1000 Arts C 300 Envir 
    UK  2000 
    UK  2001 Z 2000 Social 
    UK  2002 Z 2000 Social 
    ... 

私はこのようになり進データ、にこれを変換しようとしている:私はRを使用してい

> State Org Year Aid Proj 
    Italy A  2000 1000 Arts 
    Italy A  2001 1000 Envir 
    Italy A  2002 1000 Arts 
    Italy B  2000 500 Arts 
    Italy B  2001 700 Social 
    Italy C  2000 300 Social 
    Italy C  2002 300 Envir 
    UK  Z  2001 2000 Social 
    ... 

、そして最良の方法は私が見つけることができますexpand.grid(unique(State), unique(Org))のようなものを使用して定義済みの可能なダイアドセットを作成してから、データをループして、対応する列を見つけてデータフレームを埋めていました。しかし、私はこれが最も効果的な方法ではないので、よりよい方法があるかどうか疑問に思っていました。私はdplyrまたはreshapeと考えましたが、解決策を見つけることができません。

これは定期的な質問ですが、本当に答えは見つかりませんでした。最も似た質問はthis oneですが、まったく同じではありません。

ありがとうございます。

+0

いくつかの使用可能なデータを提供すると便利です(例えば、 'dput'など)。 – Haboryme

+1

このブログ記事は、このテーマをカバーするうえで非常にうまくいきます。http://www.milanor.net/blog/reshape-data-r-tidyr-vs-reshape2/ –

+0

実際、これは重複している可能性があることに気付きました。http: //stackoverflow.com/a/25932131/2416535 – jakub

答えて

1

あなたがdputを使用していないので、私は試してみて、あなたに似ているいくつかのデータになります。

dat = data.frame(State = rep(c("Italy", "UK"), 3), 
       Year = rep(c(2014, 2015, 2016), 2), 
       Org1 = letters[1:6], 
       Aid1 = sample(800:1000, 6), 
       Proj1 = rep(c("A", "B"), 3), 
       Org2 = letters[7:12], 
       Aid2 = sample(600:700, 6), 
       Proj2 = rep(c("C", "D"), 3), 
       stringsAsFactors = FALSE) 

dat 

# State Year Org1 Aid1 Proj1 Org2 Aid2 Proj2 
# 1 Italy 2014 a 910  A g 658  C 
# 2 UK 2015 b 926  B h 681  D 
# 3 Italy 2016 c 834  A i 625  C 
# 4 UK 2014 d 858  B j 620  D 
# 5 Italy 2015 e 831  A k 650  C 
# 6 UK 2016 f 821  B l 687  D 

次は私がデータをgatherして、2つの新しい列を作るためにextractを使用し、再度すべてを広めます:

library(tidyr) 
library(dplyr) 

dat %>% 
    gather(key, value, -c(State, Year)) %>% 
    extract(key, into = c("key", "num"), "([A-Za-z]+)([0-9]+)") %>% 
    spread(key, value) %>% 
    select(-num) 

# State Year Aid Org Proj 
# 1 Italy 2014 910 a A 
# 2 Italy 2014 658 g C 
# 3 Italy 2015 831 e A 
# 4 Italy 2015 650 k C 
# 5 Italy 2016 834 c A 
# 6 Italy 2016 625 i C 
# 7  UK 2014 858 d B 
# 8  UK 2014 620 j D 
# 9  UK 2015 926 b B 
# 10 UK 2015 681 h D 
# 11 UK 2016 821 f B 
# 12 UK 2016 687 l D 

これは望ましい出力ですか?

+0

これは大変参考になりました、ありがとうございます!データを提供しなかったのを残念に思って、遅すぎました。 –

関連する問題