Я хочу обобщить результаты 3-мерного массива, зависящие от информации из двух других наборов данных.Скажем, число людей i , которые после переворачивания k монет в год t ( массив ) имеют по крайней мере 1 голову, с результатамиорганизованный пол человека ( вектор ) и монета, которую они использовали для каждого броска, цента или четверти ( матрица ).Каков наилучший способ добиться этого?
Ниже приведены два подхода, которые я попробовал.Хотя кажется, что они работают, их масштабирование занимает слишком много времени ...
Пусть A - это массив, хранящий сальто монет, X - вектор, хранящий пол людей, а Y - матрица, хранящая используемые монеты:
A <- array(sample(c("H","T"), size=n.i*n.t*n.k, replace=T), dim=c(n.i, n.t, n.k))
X <- as.logical(rbinom(n.i, 1, 0.49))
Y <- matrix(as.logical(rbinom(n.i*n.k, 1, 0.3)), nrow=n.i, ncol=n.k)
В моем случае n.i <- 10^5
n.t <- 10^2
n.k <-10
Подход 1 - Векторизованный подход:
result <- matrix(0, nrow=n.t, ncol=4)
count <- matrix(0, nrow=n.i, ncol=n.t)
heads <- A=="H"
for (x in 0:1) { # male or female
for (y in 0:1) { # dime or quarter
count <- 0
for (k in 1:n.k) {
count <- count + 1*(X==x & Y[,k]==y & heads[,,k])
}
result[,1+x+2*(y-1)] <- colSums(count>0)
}
}
Подход 2 - Расширить X и Y до размеров, аналогичных A, фиксируя значения вдоль оси k и t, например: X <- array(X, dim=c(n.i, n.t, n.k))
.Затем используйте apply ():
for (x in 0:1) {
for (y in 0:1) {
result[,1+x+2*(y-1)] <- apply(apply(X==x & Y==y & heads, 3, sum)>0, 2, sum)
}
}
Кто-нибудь есть лучшие решения?