Скажем, у меня есть матрица значенийR: Раскол матрица на произвольное число блоков
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
То, что я хочу, это функция, которая может сделать мне матрицу произвольного размера с произвольным числом блоков типа окрестностей как N1
или N2
. Я с трудом пытаюсь понять, как такая функция будет иметь дело с ситуациями, когда желаемое количество блоков не является даже квадратами. 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"
Кто-нибудь знает о существующей функции, которые могут сделать этот вид раскола, или есть какие-либо идеи о том, как сделать один ? Спасибо!
[[Edit]] Моя последняя функция, принимая во внимание рекомендации Винсента:
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)
Спасибо, Винсент, я думаю, что смогу получить то, что мне нужно, –