2012-01-12 1 views
2

(マーク・再捕獲履歴):R:観測値の順序を再構築するために2つの列に一致する私は、私はここに掲載のものと同様の問題持って

Comparing two columns: logical- is value from column 1 also in column 2?

しかし、データがわずかに異なるであるがフォーマット。一般的なデータ構造は、3日間にわたって撮影された1列の写真のリストと、1列の写真と一致する1列の写真の列です。その他の情報は、撮影日の日です。相互に排他的です。特定の個人の1日あたり1枚の写真しかありません(つまり、両方とも1日目であるため、以下の例では「A」は「B」と一致しません)。

photo <- c('A','B','C','D','E','F','G','H','I','J','K','K','L') 
day <- c(1,1,1,1,2,2,2,3,3,3,3,3,3) 
matching_photo <- c(NA,NA,NA,NA,NA,'A','B','E',NA,NA,'F','A','C') 
DF <- data.frame(photo,day,matching_photo) 

私が探していますデータ出力はこれです:

個人を識別するためのシリアル番号(私が行くように構成されたので、ちょうど1からのシーケンシャルシリーズで始まる)が含まれ
serial.no <- c(1,2,3,4,5,6) 
individuals <- c('A,F,K','B,G','C,L','D','E,H','I') 
histories <- c('111','110','101','100','011','001') 
finalDF <- data.frame(individuals,histories) 

、列内の各個人に対応する写真のリスト、および履歴が表示されます。履歴は、1日目に観察され、3日目まで観察されなかった場合、履歴が「101」になるようなバイナリ形式に従います。しかし、2日目にしか観察されなかった場合、あなたの歴史は "010"になります。

この特定のデータセットで問題となっている問題の1つは、上記の問題と比較して、個人が3日間連続して見られた場合、写真の列にその個人のレコードが2つあります(上記の例では「K」)、前日の両方の写真(「A」と「F」)を一致させます。私は提供された助けを感謝します。ありがとうございました!

+0

いくつかの便利なアドバイス:いくつかの有用な回答がありました(少なくともあなたのコメントが示すとおりです)。このサイトを使用している他の人には、回答を「承諾済み」(その隣のチェックマークをクリックしてください)とマークすると、あなたの問題を解決した場合は非常に役に立ちます。あなたの質問を見ている他の人は、その答えがあなたの問題を解決したかどうかを知るでしょう。 (また、ここでは丁寧なことを一般的に考えています。) – joran

+0

すみません、私はそれをやります。私はそれを認識しませんでした!完了しました。小さなチェックマークを見つけるのに1分かかった。ありがとう。 – Nate

+0

入手しました。私はいつもここで良い答えを受けました! – Nate

答えて

1

ここで難しいのは、同じ個人のすべてである写真のグループを見つけることです。写真Aの動物が写真Gの動物と一致し、写真Lが写真Gと一致する場合は、写真A、G、Lをすべてリンクしていると認識するアルゴリズムが必要です。

これは、ネットワークの分析では、古典的な問題ですので、私は「ネットワーク分析と可視化」のためのパッケージ自体を呼び出すigraphパッケージになりました。これは、「隣接行列」、ノード間の接続をコード化行列からリンクされたクラスタを引き出します機能clusters()を含み、それは次のようになります。

[1,] 1 . . . . . . . . . . . 
[2,] . 1 . . . . . . . . . . 
[3,] . . 1 . . . . . . . . . 
[4,] . . . 1 . . . . . . . . 
[5,] . . . . 1 . . . . . . . 
[6,] 1 . . . . 1 . . . . . . 
[7,] . 1 . . . . 1 . . . . . 
[8,] . . . . 1 . . 1 . . . . 
[9,] . . . . . . . . 1 . . . 
[10,] . . . . . . . . . 1 . . 
[11,] 1 . . . . 1 . . . . 1 . 
[12,] . . 1 . . . . . . . . 1 

上記の行列は、あなたのデータのための隣接行列です。 12の行と列は12枚の写真、A〜Lを表しています。同じ動物の写真には1と記されています。他のセルは0ではなくドットでマークされています。これは実際には疎な行列用に設計された特別な表現であり、Matrixパッケージによって提供されています。 (私はあなたが巨大なデータセット持っている場合にはその表現を選んだ:nlarge写真は、コンピュータのメモリを圧倒可能性がある、nlarge^2細胞とマトリックスが生成されます)

を次のコードでは、最初のチャンクは、第二、隣接行列を構築します各動物の写真群を引き出し、第3のチャンクはあなたが求めた形で結果を一緒に戻します。

library(Matrix) 
library(igraph) 

# Construct an adjacency matrix, in which pairs of photos of the same 
# individual are encoded with 1's 
photos <- as.character(unique(DF$photo)) 
n <- length(photos) 
pairs <- subset(DF, !is.na(matching_photo), 
       select = c("photo", "matching_photo")) 
pairs[] <- lapply(pairs, FUN=function(X) match(X, photos)) 
M <- 1 * with(pairs, sparseMatrix(i = c(seq_len(n), photo), 
            j = c(seq_len(n), matching_photo))) 

# Extract vectors of photos of the same individual 
(clust <- clusters(graph.adjacency(adjmatrix=M))) 
# $membership 
# [1] 0 1 2 3 4 0 1 4 5 6 0 2 
# $csize 
# [1] 3 2 2 1 2 1 1 
# $no 
# [1] 7 

# Process results of clustering to construct output data.frame 
DF2 <- cbind(individual = clust$membership, 
      subset(DF, !duplicated(photo), select=c("photo", "day"))) 
grps <- tapply(DF2$photo, DF2$individual, paste, collapse=",") 
days <- tapply(DF2$day, DF2$individual, 
       FUN=function(X) paste((1 * unique(DF$day) %in% X), collapse="")) 
data.frame(individual = as.numeric(names(grps)), photos = grps, days=days) 
# individual photos days 
# 0   0 A,F,K 111 
# 1   1 B,G 110 
# 2   2 C,L 101 
# 3   3  D 100 
# 4   4 E,H 011 
# 5   5  I 001 
# 6   6  J 001 
+0

ニース。私はちょうどこれを試しました - この行にエラーがあります "M - 1 * with(pairs2、sparseMatrix(i = c(seq_len(n)、photo))"はpairs2が "pairs"であると思われますか? – Nate

+0

これをキャッチしていただきありがとうございます。私は今編集しました。 –

+0

まあ、私はこのことにびっくりしました。しばらくの間、いくつかの奇妙な理由のために私はそれを私の実際のデータで動作させることができません。私は何か見落とさなかったことを望んでいますが、私はこのことを注いできました。この例のデータを比較すると、jにはNAがありますが、動作してもエラーは発生しません。それ以外の意味はありますか?私のDFは別のオブジェクトに分割されており、それらは文字形式ですが、それは助けになりませんでした。ペアステップはすべて正常に動作するようです...任意のヒント? – Nate

関連する問題