2

我有 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)
4

3 回答 3

3

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

# 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
于 2016-08-03T10:52:26.237 回答
1

您可以使用创建设计矩阵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"
于 2016-08-03T10:49:23.660 回答
1

这是一个单线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
于 2016-08-03T11:06:45.963 回答