我想将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
答案 0 :(得分:4)
我们可以将apply
与MARGIN=1
一起使用来获取'input'每行的cumsum
,转置(t
)并与'input'相乘,以便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