Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将1和0的矩阵转换为行和计数矩阵_R_Matrix_Rowsum - Fatal编程技术网

R 将1和0的矩阵转换为行和计数矩阵

R 将1和0的矩阵转换为行和计数矩阵,r,matrix,rowsum,R,Matrix,Rowsum,我想将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,

我想将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
set.seed(404)

输入我们可以使用
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
或者我们可以使用
library(matrixStats)
中的
rowCumsums
获取每行的
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

我们可以使用
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
或者我们可以使用
library(matrixStats)
中的
rowCumsums
获取每行的
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

太神了我很抱歉把目标帖子移到这里,但是你知道一个矩阵为-1,0,1的解决方案吗?负值相加,正值开始相加up@user1499626这应该是一个单独的问题。一些基准测试意味着第二个解决方案要快得多。太棒了。我很抱歉把目标帖子移到这里,但是你知道一个矩阵为-1,0,1的解决方案吗?负值相加,正值开始相加up@user1499626这应该是一个单独的问题。一些基准测试意味着第二个解决方案要快一些。看起来你在这里得到了一个很好的答案,但是请注意,在这个网站上收到的最好的问题通常包括你自己解决问题的尝试和你遇到的困难的描述。你是对的。我试着排名,然后在列表中乱搞,但我不知道如何解决这个问题并保持矩阵结构看起来你在这里得到了一个很好的答案,但是请注意,在这个网站上收到的最好的问题通常包括你自己解决问题的尝试和你遇到的困难的描述。你是对的。我试着排名,然后在列表中乱搞,但我不知道如何解决这个问题并保持矩阵结构