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