2017-05-31 8 views
0

私は、私のデータセットのすべてのプロットのペアワイズ比較の行列を持っています。行列の塗りつぶしは、プロット間で共有される種を表します。これらのプロットは、特定の領域に関連している元の行列を作るために使用された因子のレベルによって小さな行列に行列をサブセット化するためのループ

data<- 

    region  plot species 
    1   104  A_B 
    1   105  B_C 
    1   106  A_B 
    1   107  C_D 
    2   108  B_C 
    2   108  E_F 
    2   109  B_C 
    2   109  E_F 
    2   110  E_F 

Plot4 Plot5 Plot6 Plot7 Plot8 Plot9 Plot10  
Plot4 NA NA  NA  NA  NA   NA  NA 
Plot5 0  NA  NA  NA  NA   NA  NA 
Plot6 1  0  NA  NA  NA   NA  NA 
Plot7 0  0  0  NA  NA   NA  NA 
Plot8 0  1  0  0  NA   NA  NA 
Plot9 0  1  0  0  2   NA  NA 
Plot10 0  0  0  0  1   1  NA 

この行列は、次のデータフレームから来ました。今、私は地域の行列のリストを作成する地域によって上記より大きな行列をサブセットループを作成したい、しかし

plots<-unique(data$plot) 
plot.num<-length(plots) 
output<-matrix(0, plot.num, plot.num) 
    for (i in 1:plot.num) { 
     for (j in 1:plot.num) { 
plot_i<-data[data$plot==plots[i],] 
plot_j<-data[data$plot==plots[j],] 
output[i,j]<-length(intersect(plot_i$species, plot_j$species)) 
    } 
} 

F.mat<-output 
F.mat[lower.tri(F.mat, diag=T)]<-0 

:私はすべての500個のプロットのために、この一対比較行列を作成し、次のループを生成しました。

output<- 

[[1]] 
    Plot4 Plot5 Plot6 Plot7  
Plot4 NA NA  NA  NA  
Plot5 0  NA  NA  NA  
Plot6 1  0  NA  NA  
Plot7 0  0  0  NA  

[[2]]  Plot8 Plot9 Plot10  
    Plot8 NA   NA  NA 
    Plot9 2   NA  NA 
    Plot10 1   1  NA 

注:これは存在/非存在ではありません。あなたが領域の上の機能にあなたの評価を入れた後、lapplyでき

+0

おそらく使用あなたのdata.frameのdput()、および編集し、それを起動し、データ、マトリックス、ループとその結果の行列、次にリスト一般的に、dput()データから始めて、物事が楽になります。構造体をここに貼り付けます。確かではありませんが、通常のように答えは42です。[link](https: /stackoverflow.com/questions/17367277/how-to-extract-intragroup-and-intergroup-distances-from-a-distance-matrix-in-r) – Chris

答えて

0

countFun <- function(relData){ 
    plots <- unique(relData$plot) 
    plot.num <- length(plots) 
    output <- matrix(NA, plot.num, plot.num) 

    if (plot.num > 1){ 
     for (i in 2:plot.num) { 
      for (j in 1:(i-1)) { 
       plot_i <- relData[relData$plot==plots[i],] 
       plot_j <- relData[relData$plot==plots[j],] 
       output[i,j] <- length(intersect(plot_i$species, plot_j$species)) 
      } 
     } 
    } 
    output 
} 

lapply(unique(data$region), function(region) countFun(data[data$region == region,])) 

# [[1]] 
#  [,1] [,2] [,3] [,4] 
# [1,] NA NA NA NA 
# [2,] 0 NA NA NA 
# [3,] 1 0 NA NA 
# [4,] 0 0 0 NA 
# 
# [[2]] 
#  [,1] [,2] [,3] 
# [1,] NA NA NA 
# [2,] 2 NA NA 
# [3,] 1 1 NA 
+0

ありがとうございました。私はエラーが発生しています: '[< - '( '* tmp *'、i、j、value = 0L)のエラー: 1つのプロットがある領域があると、エラーが発生しますか?第二に、私の実際のデータフレームの名前はB.dataです。このコードが正しく動作するために、 'relData'と' data'を 'B.data'に置き換えるべきですか? – Danielle

+0

'data'を' B.data'に置き換えてください。そうです。 1つのプロットだけの領域では、実際にはエラーが発生します。関数内の長さをチェックする必要があります。私はそれに応じて答えを編集します。 – ikop

関連する問題