2016-08-03 3 views
2

У меня есть вектор размеров выборки для 4 популяций: 3 2 1 4, который суммируется до 10 особей. Мне нужен код, который может динамически (поэтому его можно использовать в разных ситуациях) сделать матрицу из 1 и 0 с 10 строками и 4 столбцами, которая имеет 3 1, а затем остальную часть этого столбца 0, а затем следующий столбец имеет 3 0, затем 2 1, затем остальные 0 и так далее, как показано ниже:Создайте сложную матрицу из вектора в r

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) 

ответ

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 
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" 
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 
Смежные вопросы