Как добавить столбцы для расширения матрицы в R - PullRequest
5 голосов
/ 04 февраля 2012

Извините, я не мог придумать более информативное название, но вот мой вызов.У меня есть матрица, и мне нужно добавить столбцы в определенных местах на основе параметров, описываемых вектором.Например, если у меня есть следующая матрица:

1, 0, 1, 2, 0
0, 0, 1, 1, 1
1, 1, 0, 0, 0
2, 0, 1, 0, 2

, но для определенного пакета R (без опознавательных знаков) мне нужно добавить столбцы NA в определенном месте.У меня есть вектор, относящийся к столбцам в матрице:

1, 1, 1, 2, 3

, который указывает, что столбцы 1-3 были из одного и того же периода выборки, а столбцы 4 и 5 были из разных периодов выборки.Мне нужно, чтобы количество столбцов в матрице равнялось максимальному числу за тот же период выборки, умноженному на количество периодов выборки.В этом случае есть три 1 (максимальное число любого уникального значения в векторе) и три периода выборки (максимальное число в векторе).Поэтому мне нужна матрица с 9 столбцами (3 х 3).В частности, мне нужно добавить новые столбцы NA после 4-го и 5-го столбцов.По сути, мне просто нужно, чтобы столбцы NA были заполнителями, чтобы иметь матрицу, в которой количество наблюдений (каждый столбец) одинаково (= 3) для каждого из периодов выборки (указано числом в векторе).Это трудно описать, но в этом воображаемом примере я хотел бы в итоге:

1, 0, 1, 2, NA, NA, 0, NA, NA
0, 0, 1, 1, NA, NA, 1, NA, NA
1, 1, 0, 0, NA, NA, 0, NA, NA
2, 0, 1, 0, NA, NA, 2, NA, NA

это будет описываться вектором, который выглядит следующим образом:

1, 1, 1, 2, 2, 2, 3, 3, 3

, хотя я и надеваюна самом деле не нужно производить этот вектор, только матрицу.Очевидно, что в этом случае было легко добавить эти столбцы, но для моих данных у меня гораздо более крупная матрица, которая в итоге будет содержать ~ 200 столбцов.Кроме того, мне, вероятно, придется сделать это для многочисленных наборов данных.

Может кто-нибудь помочь мне с способом кодирования этого в R, чтобы я мог автоматизировать процесс расширения матрицы?

Спасибодля любого совета или предложений!


РЕДАКТИРОВАТЬ: чтобы сделать вещи немного более похожими на мои фактические данные, вот воспроизводимая матрица и вектор, похожий на мои текущие:

    m <- matrix(rpois(120*26, 1), nrow = 120, ncol = 26)
    v <- c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7)

Ответы [ 2 ]

4 голосов
/ 04 февраля 2012

Предполагая, что m - это матрица, а v - это вектор, вы можете использовать что-то вроде

 t = table(v)
 size = dim(m)[1] * max(t)   # size of each block based on the longest
 matrix(unlist(lapply(names(t), function(i) {
               x = m[, v == i]                  # get the short block
               c(x, rep(NA, size - length(x)))  # extend it to size
         })), dim(m)[1])
1 голос
/ 04 февраля 2012

Чтобы изменить матрицу так, как вы просили, предполагая, что матрица матовая:

nr <- nrow(mat)
nas <- rep(NA, nr)
l <- lapply( 4:ncol(mat), function(x) matrix(c(mat[,x],nas,nas), nrow = nr) )
cbind(mat[,1:3], do.call(cbind,l))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...