Как можно сделать матрицу из массива в R? - PullRequest
0 голосов
/ 17 апреля 2020

Я хочу иметь матрицу , в которой каждый элемент является массивом . Этот массив взят за подмножество кадра данных, но пример может быть обобщен для любого массива.

Я пытался с:

My_matrix <- matrix(array(), nrow = NROW, ncol =  NCOL) 

for (i in 1:NROW){
  for(j in 1:NCOL){
    My_matrix[i,j] <- df[df$var1 == j & df$var2== i,]$var3
  }
} 

, но я получил это сообщение об ошибке:

Error in My_matrix[i,j] <- df[df$var1== j & df$var2== i,]$var3 : 
  number of items to replace is not a multiple of replacement length

Как мне определить и получить доступ к каждому элементу матрицы и каждому элементу содержащийся массив?

1 Ответ

0 голосов
/ 17 апреля 2020

Мне кажется, я понимаю, что: (1) базовый массив 45х3; (2) каждая ячейка имеет матрицу разного размера; и (3) это не известно априори. Попался. Невозможно. Массив (матрица) всегда имеет идеальные размеры, и хотя вы можете динамически изменять одно или несколько измерений, вы изменяете для всех ячеек.

Альтернатива: список -columns .

dat <- data.frame(x=1:3, y=11:13)
dat$z <- lapply(3:5, function(i) matrix(seq_len(i^2), nr=i))
dat
#   x  y
# 1 1 11
# 2 2 12
# 3 3 13
#                                                                                           z
# 1                                                                 1, 2, 3, 4, 5, 6, 7, 8, 9
# 2                                     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
# 3 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25

Это выглядит не очень привлекательно, но если вам нужна другая презентация , вы можете рассмотреть возможность присвоения ей tibble::tbl_df (доступно всякий раз, когда dplyr также загружается). (Обратите внимание, что представление отличается от хранилище и доступность .)

library(tibble)
as_tibble(dat)
# # A tibble: 3 x 3
#       x     y z                
#   <int> <int> <list>           
# 1     1    11 <int[,3] [3 x 3]>
# 2     2    12 <int[,4] [4 x 4]>
# 3     3    13 <int[,5] [5 x 5]>

Подмножество согласовано:

dat$z[ dat$x == 2 & dat$y == 12 ]
# [[1]]
#      [,1] [,2] [,3] [,4]
# [1,]    1    5    9   13
# [2,]    2    6   10   14
# [3,]    3    7   11   15
# [4,]    4    8   12   16

### note that you need an extra [[1]] to get to the real data
m <- dat$z[ dat$x == 2 & dat$y == 12 ][[1]]
m
#      [,1] [,2] [,3] [,4]
# [1,]    1    5    9   13
# [2,]    2    6   10   14
# [3,]    3    7   11   15
# [4,]    4    8   12   16
m[3,4]
# [1] 15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...