Je dispose d'une matrice de 13 lignes et 12 colonnes constituée de 0.
Code : Tout sélectionner
mat<-matrix(0, ncol = 12, nrow = 13)
colnames(mat)<-rep(paste0("X",1:4),3)
La matrice "mat" est une matrice de contraintes. En colonnes, j'ai quatre variables de décision (X1,X2,X3,X4); chaque variable est répétée trois fois.
En lignes, j'ai des contraintes (au nombre de 13).
Lignes 1 à 4: contraintes de validité pour mes variables de décision.
Les autres variables de contrainte évoluent par groupe de 3.
Lignes 5 à 7: contraintes de ma première variable
Lignes 8 à 10: contraintes de ma deuxième variable
Lignes 11 à 13: contraintes de ma troisième variable
Je dispose également d'un dataframe
Code : Tout sélectionner
df<-structure(list(names = c("X1", "X2", "X3", "X4"),
car = c(1,1,1,1),
value1 = c(1,0,2,4),
value2 = c(3,5,7,9)),
class = "data.frame", row.names = c(NA, -4L))
L'objectif est de remplir les lignes de la matrice suivant un ordre et des conditions. Je souhaiterais obtenir une matrice de ce type à la fin:
Code : Tout sélectionner
nb<-4
for(i in 1:nb){
mat[i,i] <- 1
mat[i, nb+i] <- 1
mat[i, (2*nb)+i] <- 1
}
mat[5,c(1:nb)] <- t(df$car)
mat[6,c((nb+1):(nb+4))] <- (df$car)
mat[7,c((nb+5):(nb+8))] <- (df$car)
mat[8,c(1:nb)] <- t(df$value1)
mat[9,c((nb+1):(nb+4))] <- t(df$value1)
mat[10,c((nb+5):(nb+8))] <- t(df$value1)
mat[11,c(1:nb)] <- t(df$value2)
mat[12,c((nb+1):(nb+4))] <- t(df$value2)
mat[13,c((nb+5):(nb+8))] <- t(df$value2)
mat
Je voudrais procéder en deux étapes pour y arriver.
1re étape: Je considère mes contraintes de validité (quatre premières lignes). Chaque ligne doit seulement être constituée du chiffre 1 trois fois.
2ème étape: Remplir les autres lignes de la matrice avec les données de mon dataframe en décalant à chaque fois.
Je sollicite de l'aide pour automatiser le code. Je dispose en réalité d'un dataframe de 500 lignes et de 11 variables. Mes variables de contraintes évoluent par groupe de 50. J'ai donc une matrice de 25.000 colonnes (500*50) et 1050 lignes (500 + 50*11).
J'ai lu qu'il est recommandé d'utiliser les matrices creuses (sparse matrix) dans de telles situations mais je ne sais pas comment procéder.
Merci d'avance pour l'aide.
Fabrice Yaméogo