R 对于循环,按用于生成原始矩阵的因子级别将矩阵子集为更小的矩阵

R 对于循环,按用于生成原始矩阵的因子级别将矩阵子集为更小的矩阵,r,matrix,R,Matrix,我有一个数据集中所有图的成对比较矩阵。基质填充表示地块之间的共享物种 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

我有一个数据集中所有图的成对比较矩阵。基质填充表示地块之间的共享物种

    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
此矩阵来自以下数据帧:

  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

数据您可以将您的评估放入一个函数中,然后
lappy
覆盖以下区域:

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

countFun在data.frame上使用dput(),然后编辑数据,然后是矩阵,然后是循环和结果矩阵,然后是列表。通常,从dput()数据开始,可以更轻松地处理问题,您可以将结构(此处的数据内容)粘贴到其中。我不确定,但看起来答案和往常一样是42,谢谢你抽出时间。我得到一个错误:
中的错误
[只需将
数据
替换为
B.data
,是的,你是对的。只有一个绘图的区域确实会导致错误。你必须检查函数内的长度。我将相应地编辑答案。
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
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