Эффективные способы суммировать массив в R в зависимости от других данных - PullRequest
0 голосов
/ 22 марта 2019

Я хочу обобщить результаты 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) 
   } 
} 

Кто-нибудь есть лучшие решения?

...