0

奇妙な形式の調査データ (他の誰かによって収集および記録されたもの) を扱っています。調査トランセクトで種の豊富さを記録しますが、特定のトランセクト中に観察された種のみをリストし、記録された可能性のあるすべての種をリストするわけではありません。各調査中にすべての種の列があり、記録されていない種は0で埋められるように、tidyrを使用してデータを再形成する方法を考え出すのに少し時間を費やしました。短い、再現可能な例を次に示します。

#This works:
Survey <- as.factor(c(rep("Survey 1",10),rep("Survey 2",10),rep("Survey 3",10)))
Species <- as.factor(c(c("A","B","C","D","E","U","V","W","X","Y"),c("A","C","E","G","I","K","M","O","Q","S"),c("B","D","F","H","J","L","N","P","R","T")))
Abundance <- ceiling(runif(30,1,50))

working.df<-cbind.data.frame(Survey,Species,Abundance)

working.spread<-working.df %>%
  group_by(Survey) %>%
  spread(Species,Abundance,drop=F,fill=0)

残念ながら、実際のデータはこれほど単純ではありません。場合によっては、1回の調査で同じ種の複数の系統を記録して、私が興味を持っていない追加の変数に関する情報を記録できるようにしました.私は調査ごとの総量を気にしています. これは、実際のデータがどのように見えるかの例です (Species2 の先頭にある二重の「A」に注意してください)。

#This doesn't work:    
Species2 <- as.factor(c(c("A","A","C","D","E","U","V","W","X","Y"),c("A","C","E","G","I","K","M","O","Q","S"),c("B","D","F","H","J","L","N","P","R","T")))

not.working.df<-cbind.data.frame(Survey,Species2,Abundance)

not.working.spread<-not.working.df %>%
  group_by(Survey) %>%
  spread(Species2,Abundance,drop=F,fill=0) 

そのため、同じ種が 2 つリストされている場合、spread 引数は機能しなくなり、おなじみのエラーが返されます。

Error: Duplicate identifiers for rows (1, 2)

そして、実際のデータセットでは、これらの重複のかなりの数でエラーが発生するため (これはいくつかのデータセットの 1 つにすぎません)、もちろん、これを手動で修正したくありません。

Error: Duplicate identifiers for rows (206, 216), (1532, 1544), (1052, 1595), (1324, 1330), (191, 212), (194, 211), (1392, 1600), (19, 37), (1404, 1599), (199, 215), (1073, 1596), (1074, 1597), (43, 44, 45), (455, 456), (380, 381, 382, 383), (447, 448), (413, 414, 415, 416, 417, 418), (303, 304), (1015, 1016), (897, 898, 1593), (1306, 1307), (1041, 1594), (1076, 1598), (1425, 1426), (49, 64), (198, 214) 

私がやりたいのは、重複した識別子全体で Abundance フィールドを合計することです。ここに同様の質問があることは知っており、それらの多くを詳しく調べましたが、これに対する解決策はまだ見つかりません. 私はスプレッドを使用してこの時点に到達するために一生懸命取り組んできましたが、これを機能させるには単純な関数コマンドが1つあるようです...アドバイスをいただければ幸いです。または、この問題に対する既存の回答を完全に見逃した場合は、その方向を教えてください。

乾杯

4

1 に答える 1

1

aosmith さん、要約スレッドの方向を教えてくれてありがとう。うまくいきました。実用的なソリューションは次のとおりです。

not.working.spread<-not.working.df %>%
  group_by(Survey,Species2) %>%
  summarize(Abundance = sum(Abundance)) %>%
  spread(Species2,Abundance,drop=F,fill=0)
于 2016-10-03T17:44:28.427 に答える