Conversió automàtica de “matrix” a “vector”

Avui inicio la categoria Tips & Tricks que té l’objectiu de ser un conjunt de post amb funcionalitats molt concretes i específiques per millorar en el dia a dia de treball amb l’R.

Amb l’objectiu de fer la vida més fàcil a l’usuari, R a vegades pren decisions per si mateix, la qual cosa en general s’agraeix, però en certes circumstàncies es torna un problema. Un exemple clàssic n’és la conversió de “matrix”  a “vector”.

La següent funció selecciona files en una matriu i després en calcula la mitjana per columnes.

selectAndMean = function(X, selectedRows){
XMod = X[selectedRows, ]
apply(XMod, 2, function(colData){
mean(colData)
})
}

Creem una nova matriu (aleatoria) i cridem la funció amb les files 1,2,3 i 4.

myMatrix = matrix(runif(5 * 10), ncol = 5, nrow = 10)
selectAndMean(myMatrix, 1:4)

El problema ve quan intentem executar la mateixa funció amb una sola fila:

selectAndMean(myMatrix, 1)

donant-nos un error.

">Error in apply(XMod, 2, function(colData) { :
  dim(X) must have a positive length"

Això és degut a que al seleccionar nomès una fila, XMod passa a ser un vector. Els vectors no tenen atribut “dim” que fa referència a les dimensions (propi de les matrius o els data.frames). És a dir, que la funció apply esperava una matriu i en canvi li ha arribat un vector. Aquest canvi de tipus el fa R automàticament sense que nosaltres li diguem res, resultant en aquest cas en un error. És a dir que el nostre codi pot funcionar perfectament, fins que un dia per casualitat seleccionem nomès una fila i aleshores ens doni error; i ens preguntarem, però si aquest codi ja funcionava bè?!

Per evitar-ho, hem de fer servir la opció “drop = FALSE” i quedaria

selectAndMean = function(X, selectedRows){
XMod = X[selectedRows, ,drop=FALSE]
apply(XMod, 2, function(colData){
mean(colData)
})
}

De totes maneres, hi ha alguna manera que per defecte no faci aquest canvi automàtic? la resposta es NO. R no és perfecte…

Aleix, RUGBCN

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: