2013-05-06 6 views
2

I ont une trame de données qui ressemble à ceci:commande IfElse utilisant colnames par R

DF1 < -data.frame (c (0,0,0), c (0,1,0), c (1,0,0))

noms (DF1) < -c ("A", "B", "C")

A B C 
1 0 0 1 
2 0 1 0 
3 0 0 0 

Je souhaite remplacer le "1" valeurs dans df1 pour les noms de colonne associés à ces valeurs, pour créer une image qui ressemble à s:

A B C 
1 0 0 C 
2 0 B 0 
3 0 0 0 

j'ai essayé le code suivant, mais il a produit le dataframe incorrect (voir la liste ci-dessous):

data.frame (ifelse (df == 1, colnames (df), 0))

A B C 
1 0 0 A 
2 0 B 0 
3 0 0 0 

Toute aide serait grandement apprécié.

+1

'DF1 <-data.frame (c (0,0,0), c (0,1,0), c (1,0,0)) noms (DF1) <- c ("A", "B", "C") 'peut être remplacé par' df1 <-data.frame (A = c (0,0,0), B = c (0,1,0), C = c (1,0,0)), FYI. – prabhasp

Répondre

4

Ce qui se passe, c'est que ifelse s'exécute une fois par colonne, et quand il s'agit de remplacer un élément, il prend le nième élément de colnames. Mais étant donné que ifelse est exécuté sur chaque colonne à la fois, l'indexation colnames finit par correspondre à l'index de ligne et non à l'index de colonne. Afin d'obtenir la bonne solution, ifelse doit s'exécuter sur les vecteurs de ligne, pas sur les vecteurs de colonne.

Voici une solution qui utilise la fonction t (transpose).

t(ifelse(t(df1)==1,names(df1),0)) 
    A B C 
[1,] "0" "0" "C" 
[2,] "0" "B" "0" 
[3,] "0" "0" "0" 
+0

parfait, merci. –

+1

+1 - Considérer également 'ifelse (df1 == 1, colnames (df1) [col (df1)]," 0 ")' – flodel

Questions connexes