2016-10-27 1 views
0

長い形式のデータフレームがあり、それをワイドフォーマットに変換したいと思います。データフレームには、一意のインスタンスとして扱う複数の繰り返し識別子があり、それらをワイドデータフレームの個々の行として表します。長い形式から広い形式へのキャスト、各行の新しい行の作成を繰り返します。

Forcing unique values before casting (pivoting) in R

しかし、上記の質問に一意のエントリは、などの個々の列が終わる:

私の質問はこれと同じです。私の質問では、データを個々の行に入れたいと思っています。

ID1 ID2 Bird Cat Dog 
A  R  1  2 0 
A  R  2  0 0 # 2 Birds in the A/ R combination so need second row (don't want to add them together) 
A  L  1  0 2 
B  R  1  0 1 
B  R  0  0 2 
B  L  0  3 0 
B  L  0  2 0 
C  R  1  2 0 
C  R  0  5 0 
C  L  2  0 3 

ユニークID1/ID2の組み合わせには繰り返しがない場合:

ID1<-c("A","A","A","A","A","B","B","B","B","B","C","C","C","C","C") 

ID2<-c("R","R","R","L","L","R","R","L","L","R","R","L","L","R","R") 

Sp<-c("Bird","Cat","Bird","Bird","Dog","Dog","Dog","Cat","Cat","Bird","Cat","Dog","Bird","Bird","Cat") 

Count<-c(1,2,2,1,2,1,2,3,2,1,2,3,2,1,5) 

DF<-data.frame(ID1,ID2,Sp,Count) 

私はワイドフォーマットに私のデータをキャストした後、私はこのように見えるために、出力データが欲しい:たとえば、キャストウオールは通常どおりに動作します。しかし、繰り返しがある場合は、2番目(または3番目または4番目)の行が作成されます。

答えて

1

あなたはID1ID2Spのグループごとに補助ID列を作成し、ID列としてID1ID2AUXIDを再構築することができます

library(dplyr) 
DF = DF %>% group_by(ID1, ID2, Sp) %>% mutate(AUXID = row_number()) %>% as.data.frame() 
reshape(DF, idvar = c("ID1", "ID2", "AUXID"), timevar = "Sp", dir = "wide") 

# ID1 ID2 AUXID Count.Bird Count.Cat Count.Dog 
# 1 A R  1   1   2  NA 
# 3 A R  2   2  NA  NA 
# 4 A L  1   1  NA   2 
# 6 B R  1   1  NA   1 
# 7 B R  2   NA  NA   2 
# 8 B L  1   NA   3  NA 
# 9 B L  2   NA   2  NA 
# 11 C R  1   1   2  NA 
# 12 C L  1   2  NA   3 
# 15 C R  2   NA   5  NA 

あなたはAUXID列を削除し、その後NA埋めることができます。

ここ

はNA値を埋めるためにfillパラメータを提供dcast()とdata.tableバージョンです:

library(data.table) 
(dcast(setDT(DF)[, AUXID := 1:.N, .(ID1, ID2, Sp)], 
     ID1 + ID2 + AUXID ~ Sp, value.var = "Count", fill = 0) 
     [, AUXID := NULL][]) 
# ID1 ID2 Bird Cat Dog 
# 1: A L 1 0 2 
# 2: A R 1 2 0 
# 3: A R 2 0 0 
# 4: B L 0 3 0 
# 5: B L 0 2 0 
# 6: B R 1 0 1 
# 7: B R 0 0 2 
# 8: C L 2 0 3 
# 9: C R 1 2 0 
#10: C R 0 5 0 
+2

があなたの 'dplyr'方法、代わりにあなたが最後にこれを追加することができますreshape'ベース'について(ID1 + ID2 + AUXID〜Sp、value.var = "Count"、塗りつぶし= 0)%>%select(-AUXID) 'dresrチェーン(' reshape2'をロードした後) – eipi10

関連する問題