2017-04-13 10 views
1

最初の非公式投稿にはお詫び申し上げます。私はそれを修正したので、今理解しやすいと思う。5つの異なるメジャー列を使用して、長い形式から広い形式にデータを変換する

私は長いフォーマットから広いフォーマットへといくつかの大きなデータセットを作り直して、共通の識別子を使ってそれらを一緒にマージしようとしていました。

データは漁業データです。現在、私はターゲットキャッチデータを長いものから広いものに変換し、各行が1つの 'TripSet'値としてデータセット全体の共通識別子であるようにフォーマットされたデータセットに追加する必要があります。

次のように私は広いに長いから変換する必要があるデータセットの形式は次のとおりです。

my.df <- data.frame(Trip=rep(c("A","B","C"), 5), Set=rep(1:5, each=3), CommonName=rep 
(c("i","j","k"),5),TotCat=1:15, Kept=16:30, RtnAlive=31:45, RtnDead= 46:60, RtnUnk= 61:75) 

my.df$TripSet <- paste(my.df$Trip,my.df$Set) 

my.df 
    Trip Set CommonName TotCat Kept RtnAlive RtnDead RtnUnk TripSet 
1  A 1   i  1 16  31  46  61  A 1 
2  B 1   j  2 17  32  47  62  B 1 
3  C 1   k  3 18  33  48  63  C 1 
4  A 2   i  4 19  34  49  64  A 2 
5  B 2   j  5 20  35  50  65  B 2 
6  C 2   k  6 21  36  51  66  C 2 
7  A 3   i  7 22  37  52  67  A 3 
8  B 3   j  8 23  38  53  68  B 3 
9  C 3   k  9 24  39  54  69  C 3 
10 A 4   i  10 25  40  55  70  A 4 
11 B 4   j  11 26  41  56  71  B 4 
12 C 4   k  12 27  42  57  72  C 4 
13 A 5   i  13 28  43  58  73  A 5 
14 B 5   j  14 29  44  59  74  B 5 
15 C 5   k  15 30  45  60  75  C 5 

次のように私は1つの変数で広いに長いから変換するには、キャストやdcastを使用することができます。

​​

しかし、ここでゼロよりも多くのNA値を取得する必要があるかどうかはわかりません。

私の希望するデータフォーマットは共通識別子 'TripSet by row'を持ち、コモンネームでそれぞれの種が 'TotCat'、 'Kept'、 'RtnAlive'、 'RtnDead'、 'RtnUnk'と一致しています。

私は次のようにデータを作り直すその後、溶融試してみました:

dcast(melt(my.df, id.vars=c("TripSet", "CommonName")), TripSet~variable+CommonName) 

    TripSet Trip_i Trip_j Trip_k Set_i Set_j Set_k TotCat_i TotCat_j TotCat_k Kept_i Kept_j Kept_k RtnAlive_i RtnAlive_j RtnAlive_k RtnDead_i 
1  A 1  A <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
2  A 2  A <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
3  A 3  A <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
4  A 4  A <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
5  A 5  A <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
6  B 1 <NA>  B <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
7  B 2 <NA>  B <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
8  B 3 <NA>  B <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
9  B 4 <NA>  B <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
10  B 5 <NA>  B <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
11  C 1 <NA> <NA>  C <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
12  C 2 <NA> <NA>  C <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
13  C 3 <NA> <NA>  C <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
14  C 4 <NA> <NA>  C <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 
15  C 5 <NA> <NA>  C <NA> <NA> <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA>  <NA>  <NA>  <NA>  <NA> 

これは、基本的に私の予想出力されますが、私は「トリップ」をキャストしたいと「SET」(と私が持っている他のいくつかの列変数はありません追加のメジャー変数として 'Kept'、 'RtnAlive'、 'RtnDead'、 'RtnUnk'のみを取り、列名には選択したメジャー変数名とCommonNameの両方を反映させます。

脇に、データがないのでNA値が生成されるため、たとえば、共通名i種が保持されなかったか、またはx個のセットにrtndeadが残っていませんか?

これで任意の助けいただければ幸いです。

+0

あなたの問題を説明するために、私たちがあなたの問題を解決するための再現可能な例を提供してください。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

期待される出力も追加してください。 – Sotos

+0

はい - NAsは欠けている組み合わせですが、私の結果は異なります - 下の私の答えを見てください。 – epi99

答えて

0
library(dplyr) 
library(reshape2) 
my.df %>% 
    melt(id.vars = c("Trip", "Set", "CommonName")) %>%  # make tall 
    dcast(Trip + Set ~ variable + CommonName)    # make wide 

# Trip Set TotCat_i TotCat_j TotCat_k Kept_i Kept_j Kept_k RtnAlive_i RtnAlive_j RtnAlive_k RtnDead_i 
# 1  A 1  1  NA  NA  16  NA  NA   31   NA   NA  46 
# 2  A 2  4  NA  NA  19  NA  NA   34   NA   NA  49 
# 3  A 3  7  NA  NA  22  NA  NA   37   NA   NA  52 
# 4  A 4  10  NA  NA  25  NA  NA   40   NA   NA  55 
# 5  A 5  13  NA  NA  28  NA  NA   43   NA   NA  58 
# 6  B 1  NA  2  NA  NA  17  NA   NA   32   NA  NA 
# 7  B 2  NA  5  NA  NA  20  NA   NA   35   NA  NA 
# 8  B 3  NA  8  NA  NA  23  NA   NA   38   NA  NA 
# 9  B 4  NA  11  NA  NA  26  NA   NA   41   NA  NA 
# 10 B 5  NA  14  NA  NA  29  NA   NA   44   NA  NA 
# 11 C 1  NA  NA  3  NA  NA  18   NA   NA   33  NA 
# 12 C 2  NA  NA  6  NA  NA  21   NA   NA   36  NA 
# 13 C 3  NA  NA  9  NA  NA  24   NA   NA   39  NA 
# 14 C 4  NA  NA  12  NA  NA  27   NA   NA   42  NA 
# 15 C 5  NA  NA  15  NA  NA  30   NA   NA   45  NA 
+0

こんにちはepi99、本当に助けてくれてありがとう。それが私の希望する出力です。 1つのトラブルシューティングの質問。上記のコードを実行すると、次のエラーメッセージが表示されます。select(。、-Trip、-Set)のエラー:未使用の引数(-Trip、-Set) –

+0

'id.vars'を使用して単純化しました。メルトのパラメータは列を選択する – epi99

+0

ありがとう。私は質問があります。それはdplyrを使って形を変えることが可能なのですか?すべての列が総漁獲量の共通名で各種の順番になっています。キャッチ、保持、rtndead、rtnaliveなど... –

関連する問題