2017-08-15 2 views
2

J'ai une matrice comme celui-ciR: Convertir matrice OUI, NON dataframe

df <- matrix(c(rep(1,3),rep(2,3)),nrow=3,ncol=2) 

df: 
     [,1] [,2] 
[1,] 1 2 
[2,] 1 2 
[3,] 1 2 

Je veux convertir chaque valeur de la cellule à YES, si elle est supérieure à 0, sinon NO

Je comprends que je peut le faire en utilisant

apply(df, 2, function(x) ifelse(x > 0, "Yes","No")) 

Cependant ma matrice est très énorme (millions * 5000), et donc l'utilisation appliquer prend incroyablement grand temps

J'ai aussi essayé

df <- ifelse(df > 0, "Yes","No") 

Cependant, même cela prend beaucoup de temps

Puis-je obtenir de meilleures performances avec cela?

+9

Pourquoi avez-vous besoin de "" Oui "/" Non "'. Faites simplement 'df> 0' et obtenez' TRUE/FALSE' à la place –

+0

Avez-vous essayé d'utiliser 'replace'? – Bati

+0

@Bati: remplacer peut être utilisé pour chaque colonne (vecteur), je dois le faire pour toutes les colonnes, cela va-t-il aider? –

Répondre

5

est ici une façon de créer la matrice:

df[] <- c("No", "Yes")[(df > 0) + 1] 

Le résultat:

 [,1] [,2] 
[1,] "Yes" "Yes" 
[2,] "Yes" "Yes" 
[3,] "Yes" "Yes" 
+0

C'est un très bon tour en effet. Avec toi. –

+0

Pourquoi avez-vous ajouté +1 ici? –

+1

@Username La commande 'df> 0' renvoie un vecteur logique avec' TRUE's et 'FALSE's. Dans les opérations mathématiques, 'TRUE' représente 1 et' FALSE' représente 0. Puisque j'ajoute 1, les vecteurs résultants contiennent 1s et 2s. Ces valeurs sont utilisées pour indexer le vecteur 'c (" Non "," Oui ")' de longueur 2. –

0

Si votre objectif est d'examiner visuellement la matrice, et ne pas utiliser le contenu, la fonction leLe symnum est conçu pour cet usage en particulier. La section Description de ?symnum indique

Coder symboliquement un vecteur ou tableau numérique ou logique donné. Particulièrement utile pour la visualisation de matrices structurées, par exemple des matrices de corrélation, éparses ou logiques.

symnum(df, cutpoints=c(-Inf, 0, Inf), symbols=c("no", "yes")) 

[1,] yes yes 
[2,] yes yes 
[3,] yes yes