Изменить форму матрицы и преобразовать ее во фрейм данных, отслеживая исходный индекс строки и столбца - PullRequest
2 голосов
/ 16 апреля 2019

У меня есть большая матрица n на m, которую я хотел бы преобразовать в (n * m) на 3 кадра данных (моя матрица что-то вроде 1400 на 800).Первый столбец фрейма данных должен содержать индекс строки матрицы.Второй столбец должен содержать индекс столбца матрицы, а третий столбец кадра данных должен содержать значение каждой ячейки из матрицы.

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

Вот небольшой воспроизводимый код моего решения, который я хотел бы улучшить.

mtx <- array(rep(rnorm(12)), dim = c(4,3))

df <- expand.grid(rnum = 1:4, cnum = 1:3)
df$cell <- NA

for (i in 1:nrow(df)){
  df$cell[i] <- mtx[df$rnum[i],df$cnum[i]]
}

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Мы можем сделать это с melt

library(reshape2)
melt(mtx)
#   Var1 Var2      value
#1     1    1 -1.2070657
#2     2    1  0.2774292
#3     3    1  1.0844412
#4     4    1 -2.3456977
#5     1    2  0.4291247
#6     2    2  0.5060559
#7     3    2 -0.5747400
#8     4    2 -0.5466319
#9     1    3 -0.5644520
#10    2    3 -0.8900378
#11    3    3 -0.4771927
#12    4    3 -0.9983864

data

set.seed(1234)
mtx <- array(rep(rnorm(12)), dim = c(4,3))
1 голос
/ 16 апреля 2019

Мы можем использовать row / col, чтобы получить значение строки и столбца для каждого значения в матрице и свернуть матрицу в вектор, чтобы получить фактическое значение и cbind все из них вместе.

cbind.data.frame(rnum = c(row(mtx)), cnum = c(col(mtx)), cell = c(mtx))

#   rnum cnum       cell
#1     1    1 -1.2070657
#2     2    1  0.2774292
#3     3    1  1.0844412
#4     4    1 -2.3456977
#5     1    2  0.4291247
#6     2    2  0.5060559
#7     3    2 -0.5747400
#8     4    2 -0.5466319
#9     1    3 -0.5644520
#10    2    3 -0.8900378
#11    3    3 -0.4771927
#12    4    3 -0.9983864

Уловка, которую мы можем использовать с which, состоит в том, чтобы найти условие, которое всегда TRUE, использовать arr.ind = TRUE, чтобы получить индекс строки и столбца и cbind значения, такие же, как указано выше.

cbind.data.frame(which(mtx > 0 | mtx < 0, arr.ind = TRUE), cell = c(mtx))

данные

set.seed(1234)
mtx <- array(rep(rnorm(12)), dim = c(4,3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...