2013-08-09 6 views
2

Je fais une fonction d'aide pour ce projet sur lequel je travaille, dans lequel je dois faire des percentiles à partir d'un ensemble de données.Distinguer un vecteur d'une matrice dans R

Dans certains cas, je vais être un percentile d'un vecteur d'entrées, ce qui est assez facile. Dans d'autres cas, je vais mettre des entrées dans une matrice.

Les processus sont similaires mais différents. J'aimerais pouvoir distinguer ce qui est donné comme une entrée (que ce soit un vecteur ou une matrice), donc je sais quelle opération est appropriée. Je pensais à faire quelque chose avec les dimensions de l'entrée. Mais dim(*vector*) = NULL, mais dim(matrix(1:15, 1,15)) = c(1,15) même si cela est discutable d'être un vecteur. Je ne peux pas utiliser ma première idée de

if(length(dim(objects)) == 2){*A MATRIX*} 
else{*A VECTOR*} 

je considérais que je pouvais ajouter la condition de min(dim(objects)) > 1 pour tester une matrice, mais je pense qu'il ya probablement une meilleure option. (Et maintenant je suis là ...)

Des pensées?

+0

vous pouvez probablement utiliser '? Is.vector' et'? Is.matrix'? – Arun

+0

Cela a le même problème de 'is.matrix (matrix (1,1,2)) = TRUE' mais ses dimensions sont' c (1,2) 'donc techniquement c'est toujours un vecteur – jameselmore

+1

alors peut-être:' est. vecteur (x) | min (dim (x))> 1'? – Arun

Répondre

4

On dirait que vous voulez ignorer toute dimension qui n'a qu'un seul niveau, donc drop serait approprié:

if(is.null(dim(drop(x)))) { 
    # do vector stuff 
} else { 
    # do matrix/array stuff 
} 
+0

Merci! J'ai fini par trouver (pour ce problème particulier) un moyen de contourner tout cela. MAIS, je ne savais pas de cette fonction, et c'est une bonne chose .. – jameselmore

2

Pourquoi ne pas utiliser prop.table pour les opérations? Vous pouvez obtenir soit rangée ou colonne proportions et si vous wnat centiles vous pouvez multiplier par 100 et autour de la précision souhaitée

> m <- matrix(1:9, 3) 
> prop.table(m, 1) 
      [,1]  [,2]  [,3] 
[1,] 0.08333333 0.3333333 0.5833333 
[2,] 0.13333333 0.3333333 0.5333333 
[3,] 0.16666667 0.3333333 0.5000000 
> prop.table(m,2) 
      [,1]  [,2]  [,3] 
[1,] 0.1666667 0.2666667 0.2916667 
[2,] 0.3333333 0.3333333 0.3333333 
[3,] 0.5000000 0.4000000 0.3750000 

> round(100*prop.table(m, 1), 2) # rounded row percentages 
     [,1] [,2] [,3] 
[1,] 8.33 33.33 58.33 
[2,] 13.33 33.33 53.33 
[3,] 16.67 33.33 50.00