假设我有一个值矩阵
set.seed(1)
A <- matrix(runif(25),ncol=5)
我想计算这个大小近似相等的矩阵内近似正方形邻域的一些统计数据。这两种输出中的任何一种都可以:
N1 <- matrix(c(rep(c("A","A","B","B","B"),2),rep(c("C","C","D","D","D"),3)),ncol=5)
N2 <- matrix(c(rep(c("A","A","A","B","B"),3),rep(c("C","C","D","D","D"),2)),ncol=5)
N1
[,1] [,2] [,3] [,4] [,5]
[1,] "A" "A" "C" "C" "C"
[2,] "A" "A" "C" "C" "C"
[3,] "B" "B" "D" "D" "D"
[4,] "B" "B" "D" "D" "D"
[5,] "B" "B" "D" "D" "D"
N2
[,1] [,2] [,3] [,4] [,5]
[1,] "A" "A" "A" "C" "C"
[2,] "A" "A" "A" "C" "C"
[3,] "A" "A" "A" "D" "D"
[4,] "B" "B" "B" "D" "D"
[5,] "B" "B" "B" "D" "D"
其他近似值也可以,因为我总是可以旋转矩阵。然后我可以使用这些邻域矩阵通过 tapply()
来计算统计数据,如下所示:
tapply(A,N1,mean)
A B C D
0.6201744 0.5057402 0.4574495 0.5594227
我想要的是一个函数,它可以使我成为一个具有任意数量的 block 状邻域(如N1
或N2
)的任意维度的矩阵。我很难弄清楚这样的函数如何处理所需数量的 block 甚至不是正方形的情况。 N1
和 N2
有 4 个社区,但假设我想要 5 个社区来输出类似这样的内容:
N3 <- matrix(c("A","A","B","B","B","A","A","C","C","C","D","D","C","C","C",
"D","D","E","E","E","D","D","E","E","E"),ncol=5)
[,1] [,2] [,3] [,4] [,5]
[1,] "A" "A" "D" "D" "D"
[2,] "A" "A" "D" "D" "D"
[3,] "B" "C" "C" "E" "E"
[4,] "B" "C" "C" "E" "E"
[5,] "B" "C" "C" "E" "E"
有谁知道现有的函数可以进行这种拆分,或者对如何进行拆分有任何想法吗?谢谢!
[[编辑]] 考虑到文森特的建议,我的最终功能是:
DecideBLocks <- function(A,nhoods){
nc <- ncol(A)
nr <- nrow(A)
nhood_side <- floor(sqrt((nc*nr)/nhoods))
Neighborhoods <- matrix(paste(ceiling(col(A)/nhood_side), ceiling(row(A)/nhood_side), sep="-"), nc=ncol(A))
nhoods.out <- length(unique(c(Neighborhoods)))
if (nhoods.out != nhoods){
cat(nhoods.out,"neighborhoods created.\nThese were on average",nhood_side,"by",nhood_side,"cells\nit's a different number than that stated the function tries to round things to square neighborhoods\n")
}
return(Neighborhoods)
}
A <- matrix(rnorm(120),12)
B <- DecideBLocks(A,13)
最佳答案
您可以尝试使用 row
和 col
函数:
他们将问题简化为一维问题。
下面定义了大小最大为 2*2 的 block 。
matrix(
paste(
ceiling(col(A)/2),
ceiling(row(A)/2),
sep="-"),
nc=ncol(A)
)
关于R:将矩阵分割成任意数量的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9430950/