Как начать с определенного числа в массиве R? - PullRequest
0 голосов
/ 25 января 2019

Если у меня есть этот массив:

   vector1 <- c(5,9,3)
   vector2 <- c(10,11,12,13,14,15)
   result <- array(c(vector1,vector2,vector1,vector2,vector1,vector2,vector1,vector2,vector1,vector2,vector1,vector2),dim = c(3,3,12))
   str(result)
  num [1:3, 1:3, 1:12] 5 9 3 10 11 12 13 14 15 5 ...

Мне нужно начать с [,, 4] и считать 3, поэтому у меня будет

 [,,4] [,,5] [,,6] and then compute the mean for them 
 [,,7] [,,8] [,,9] and then compute the mean for them
 [,,10] [,,11] [,,12] and then compute the mean for them

1 Ответ

0 голосов
/ 25 января 2019

Вот один из вариантов. Подмножество 'result' с индексами по третьему измерению, split последовательность третьего измерения с переменной группировки, созданной с помощью gl, цикл по индексу, подмножество элементов array на основе индекса, Reduce: получить sum соответствующих элементов и разделить на 3, чтобы получить mean

s1 <- result[,, 4:12]
i1 <- seq(dim(s1)[3])
out <- lapply(split(i1, as.integer(gl(length(i1), 3, length(i1)))),
     function(i) Reduce(`+`, lapply(i, function(i2) s1[,, i2]))/3)

Если мы хотим, чтобы array вывел

array(unlist(out), c(3, 3, 3))

Или melt в «длинном» формате с индексами, затем создайте переменную группировки, summarise, чтобы получить mean

library(tidyverse)
library(reshape2)
melt(result[, , 4:12]) %>%
   group_by(Var1, Var2, grp = ((Var3-1) %/% 3 ) + 1) %>%
   summarise(value = mean(value)) %>%
   split(.$grp) %>% 
   map(~ .x %>% 
            select(-grp) %>% 
            spread(Var2, value) %>% 
            tibble::column_to_rownames('Var1')) %>% 
   unlist %>% 
   array(c(3, 3, 3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...