【问题标题】:Create a complicated matrix from vector in r从 r 中的向量创建一个复杂的矩阵
【发布时间】:2016-12-09 00:58:14
【问题描述】:

我有一个包含 4 个群体的样本量向量:3 2 1 4,总和为 10 个人。我需要可以动态的代码(因此可以在不同的情况下使用)制作一个由 1 和 0 组成的矩阵,其中 10 行和 4 列有 3 个 1,然后该列的其余部分是 0,然后下一列有 3 个 0,然后是 2 个 1其余的 0 以此类推,如下所示:

1 0 0 0
1 0 0 0
1 0 0 0
0 1 0 0
0 1 0 0
0 0 1 0
0 0 0 1
0 0 0 1
0 0 0 1
0 0 0 1

输入:

nSamples <- c(3,2,1,4)

【问题讨论】:

    标签: r vector rep


    【解决方案1】:

    这是一个可能的两步方法。

    # create a matrix of zeros first
    m <- matrix(0L, ncol = length(nSamples), nrow = sum(nSamples))
    # then replace relevant 0s with 1s:
    m[cbind(1:nrow(m), rep(seq_along(nSamples), nSamples))] <- 1L
    m
    #      [,1] [,2] [,3] [,4]
    # [1,]    1    0    0    0
    # [2,]    1    0    0    0
    # [3,]    1    0    0    0
    # [4,]    0    1    0    0
    # [5,]    0    1    0    0
    # [6,]    0    0    1    0
    # [7,]    0    0    0    1
    # [8,]    0    0    0    1
    # [9,]    0    0    0    1
    # [10,]   0    0    0    1
    

    如果你愿意的话,“诀窍”是

    rep(seq_along(nSamples), nSamples)
    #[1] 1 1 1 2 2 3 4 4 4 4
    

    【讨论】:

      【解决方案2】:

      您可以使用model.matrix创建设计矩阵

      f_nSamples <- factor(rep(nSamples, nSamples), orderd=TRUE)
      model.matrix(~f_nSamples-1)
      ##    f_nSamples1 f_nSamples2 f_nSamples3 f_nSamples4
      ## 1            1           0           0           0
      ## 2            1           0           0           0
      ## 3            1           0           0           0
      ## 4            0           1           0           0
      ## 5            0           1           0           0
      ## 6            0           0           1           0
      ## 7            0           0           0           1
      ## 8            0           0           0           1
      ## 9            0           0           0           1
      ## 10           0           0           0           1
      ## attr(,"assign")
      ## [1] 1 1 1 1
      ## attr(,"contrasts")
      ## attr(,"contrasts")$f_nSamples
      ## [1] "contr.treatment"
      

      【讨论】:

        【解决方案3】:

        这是一个带有sparseMatrix的单行代码

        library(Matrix)
        m1 <- sparseMatrix(i = seq(sum(nSamples)), j = rep(seq_along(nSamples), nSamples), x = 1)
        as.matrix(m1)
        #      [,1] [,2] [,3] [,4]
        #[1,]    1    0    0    0
        #[2,]    1    0    0    0
        #[3,]    1    0    0    0
        #[4,]    0    1    0    0
        #[5,]    0    1    0    0
        #[6,]    0    0    1    0
        #[7,]    0    0    0    1
        #[8,]    0    0    0    1
        #[9,]    0    0    0    1
        #[10,]   0    0    0    1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-26
          • 2016-05-22
          • 1970-01-01
          • 2021-08-08
          • 1970-01-01
          • 2013-09-07
          相关资源
          最近更新 更多