2017-05-26 6 views
0

のレベルの各組み合わせの間で一致の出力行列へのデータフレームのリストでは、ループのために私はそうのようなデータフレームを持っている:R:要因

region  plot species 
1   1A  A_B 
1   1B  B_C 
1   1C  A_B 
1   1D  C_D 
2   2A  B_C 
2   2A  E_F 
2   2B  B_C 
2   2B  E_F  
2   2C  E_F 
2   2D  B_C 
3   3A  A_B 
3   3B  A_B   

このデータフレームは、数千行のために行くので、私は希望ループを使用して: 1)領域ごとにデータをサブセット化します。 2)次に、サブセットされた各領域内のプロット のすべてのペアごとの比較のための行列を作成します。

この場合、行列のi次元とj次元は領域内のプロットIDであり、行列の塗りつぶしは共有される種の組み合わせの数を含みます。満たされていない行列の半分は、NAsで埋められます。これらの行列はリストに入れられます。この例では、結果は次のようになります。ここでは

resultslist<- 
[[1]]  1A 1B 1C 1D  

     1A NA NA NA NA NA 

     1B 0 NA NA NA NA 

     1C 1 0 NA NA NA 

     1D 0 0 0 NA NA 

[[2]]  2A 2B 2C 2D  

     2A NA NA NA NA NA 

     2B 2 NA NA NA NA 

     2C 1 1 NA NA NA 

     2D 1 1 0 NA NA 


[[3]]  3A 3B  

     3A NA NA 

     3B 1 NA 

は、私が試してみましたループです:

data<- subset(file, select = c(region,plot, species)) 

sublist=NA 
for (i in unique(data$region)){ 
    sublist[i]<-list(subset(data, data[,1] == i)) 
    print(i) 
} 

results = list() 

for (i in 1: length(unique(sublist))){ 
    output<- matrix(0, nrow = length(plot), ncol = length(plot)) 
    plot_i<-unique(sublist[[i]][[2]]) 
    plot_j<-unique(sublist[[i]][[2]]) 
    output[i,j]<-length(intersect(plot_i$species, plot_j$species)) 

results[[i]]=output 
    } 
results 

答えて

0

私はあなたのコードに続けました。この思い付いた:データを

data=read.table(text="region  plot species 
1   1A  A_B 
1   1B  B_C 
1   1C  A_B 
1   1D  C_D 
2   2A  B_C 
2   2A  E_F 
2   2B  B_C 
2   2B  E_F  
2   2C  E_F 
2   2D  B_C 
3   3A  A_B 
3   3B  A_B",stringsAsFactors=F,h=T)  

コード:

sublist=NA 
for (i in unique(data$region)){ 
    sublist[i]<-list(subset(data, data[,1] == i)) 
    print(i) 
} 

results = list() 
for (r in unique(data$region)){ 
    myset<-split(sublist[[r]][[3]],sublist[[r]][[2]]) 
    output<- matrix(NA, nrow = length(myset), ncol = length(myset)) 
    rownames(output)<-colnames(output)<-unique(sublist[[r]][[2]]) 
    for (j in 1:(length(myset)-1)){ 
    for (i in (j+1):length(myset)){ 
     output[i,j]=sum(myset[[j]] %in% myset[[i]]) 
    } 
    } 
results[[r]]=output 
} 

出力:

[[1]] 
    1A 1B 1C 1D 
1A NA NA NA NA 
1B 0 NA NA NA 
1C 1 0 NA NA 
1D 0 0 0 NA 

[[2]] 
    2A 2B 2C 2D 
2A NA NA NA NA 
2B 2 NA NA NA 
2C 1 1 NA NA 
2D 1 1 0 NA 

[[3]] 
    3A 3B 
3A NA NA 
3B 1 NA 
+0

はお時間をありがとうございました。このコードは、私があなたに提供したサンプルデータを使用したときに効果的でした。しかし、実際のデータを使ってみると、次のようなエラーが出ます: 'rownames < - '( '* tmp *'、value = 66L)のエラー: 'dimnames'の長さ[1]これはかもしれない?また、コードの7行目で一貫性のために提供したコードに対する1つの小さな修正:for(一意的な(df $ region)のr) "df"を "data"に変更する必要があります。 @GyB – Danielle

+0

ええ、データを見ることなく伝えるのは難しいです。 rownamesを定義する行を次のように変更することができますか? 'rownames(output)< - colnames(output)< - names(myset)'? – Bea

+0

訂正ありがとう、私は行を編集しました – Bea