【问题标题】:Convert a matrix of 1s and 0s to a row-sum count matrix将 1 和 0 的矩阵转换为行和计数矩阵
【发布时间】:2015-08-27 15:06:49
【问题描述】:

我想将 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

【问题讨论】:

  • 看起来您在这里得到了很好的答案,但请注意,本网站上最受欢迎的问题通常包括您自己解决问题的尝试以及您遇到的困难的描述。
  • 你是对的。我尝试排名,然后乱用列表,但我不知道如何解决问题并保持矩阵结构

标签: r matrix rowsum


【解决方案1】:

我们可以使用applyMARGIN=1 来获得'input' 每一行的cumsum,转置(t)并与'input' 相乘,这样1 的值就会被@987654325 替换@output 和 '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 from 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

【讨论】:

  • 太棒了。我很抱歉将球门柱移到这里,但是您知道矩阵为 -1、0、1 的解决方案吗?其中负值相加,正值开始相加
  • @user1499626 这应该是一个单独的问题。
  • 一些基准测试意味着第二种解决方案要快很多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 2017-02-21
相关资源
最近更新 更多