Преобразуйте матрицу из 1 и 0 в матрицу подсчета суммы строк

Я хотел бы преобразовать матрицу 0 и 1 в соответствующую матрицу, которая дает кумулятивную сумму строк для ненулевых записей. Пример ввода и вывода приведен ниже:

set.seed(404)
input  <- matrix(rbinom(10 * 5, 1, 0.5), ncol = 5, nrow = 5)
output <- data.frame(a = c(1, 1, 1, 1, 0),
                     b = c(0, 0, 0, 0, 0),
                     c = c(2, 2, 0, 2, 1),
                     d = c(3, 0, 0, 3, 2),
                     e = c(0, 3, 0, 0, 0))

input
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    0    1    1    0
#[2,]    1    0    1    0    1
#[3,]    1    0    0    0    0
#[4,]    1    0    1    1    0
#[5,]    0    0    1    1    0
output
#  a b c d e
#1 1 0 2 3 0
#2 1 0 2 0 3
#3 1 0 0 0 0
#4 1 0 2 3 0
#5 0 0 1 2 0

person jonnie    schedule 27.08.2015    source источник
comment
Похоже, здесь вы получили хороший ответ, но обратите внимание, что наиболее часто задаваемые вопросы на этом сайте обычно включают вашу собственную попытку решить проблему и описание трудностей, с которыми вы столкнулись.   -  person josliber♦    schedule 27.08.2015
comment
ты прав. я пробовал ранжировать, а потом возиться со списками, но я понятия не имел, как решить проблему и сохранить матричную структуру   -  person jonnie    schedule 27.08.2015


Ответы (1)


Мы можем использовать apply с MARGIN=1, чтобы получить cumsum каждой строки «входа», транспонировать (t) и умножить на «вход», чтобы значения 1 были заменены выходом cumsum, а «0» остались прежними.

input*t(apply(input, 1, cumsum))
#   [,1] [,2] [,3] [,4] [,5]
#[1,]    1    0    2    3    0
#[2,]    1    0    2    0    3
#[3,]    1    0    0    0    0
#[4,]    1    0    2    3    0
#[5,]    0    0    1    2    0

Или мы можем использовать rowCumsums из library(matrixStats), чтобы получить cumsum каждой строки и умножить, как раньше.

library(matrixStats)
input*rowCumsums(input)
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    0    2    3    0
#[2,]    1    0    2    0    3
#[3,]    1    0    0    0    0
#[4,]    1    0    2    3    0
#[5,]    0    0    1    2    0
person akrun    schedule 27.08.2015
comment
удивительно. Прошу прощения за перенос целевого поста сюда, но знаете ли вы решение с матрицей -1, 0, 1? где отрицательные значения складываются, а положительные значения начинают складываться - person jonnie; 27.08.2015
comment
@ user1499626 Это должен быть отдельный вопрос. - person akrun; 27.08.2015
comment
Некоторые тесты показывают, что второе решение немного быстрее. - person Dason; 27.08.2015