Traitements selon le nom des colonnes
Bonjour,
J'ai un data.frame d'une centaine de colonnes, que je voudrais transformer selon le nom des colonnes.
Comme c'est un peu compliqué à expliquer, voici un exemple :
J'ai le data.frame suivant (appelons le T1) :
Code:
1 2 3
| Num A01 A02 B01 B02 CC
1 0 0 0 2 001
2 2 0 1 0 002 |
Il est produit avec le programme T1 <- data.frame(Num=c('1','2'),A01=c(0,2),A02=c(0,0),A03=c(0,1),A04=c(2,0),BB=c('001','002'))Remarque : La variable Num est le numéro des observations.
Je voudrais créer un data.frame T2 :
Code:
1 2 3 4
| Num CC DD NB
1 001 B02 2
2 002 A01 4
2 002 B01 1 |
Lorsque le nom d'une variable commence par la lettre A, sortir la valeur si elle est non nulle.
Lorsque le nom d'une variable commence par la lettre B, sortir le double de la valeur si elle est non nulle.
Cela revient à créer un programme qui ressemble à ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| Initialisation :
Créer un data.frame vide, avec les variables Num, CC, DD, NB
Pour chaque observation :
Pour chaque variable dont le nom commence par la lettre A :
Si la valeur de la variable est non nulle alors
DD=nom de la variable
NB=valeur de la variable
Sortir le résultat dans le nouveau data.frame
Pour chaque variable dont le nom commence par la lettre B :
Si la valeur de la variable est non nulle alors
DD=nom de la variable
NB=2 * valeur de la variable
Sortir le résultat dans le nouveau data.frame |
Mon problème est de créer un data.frame vide que je remplie peu à peu, en faisant un traitement différencié selon le nom des variables.
Est-ce que quelqu'un saurait réaliser un tel programme avec R ?
Traitements selon le nom des colonnes
Bonjour,
Une proposition de code avec la fonction melt() du package reshape2 :
Code:
1 2 3 4 5 6 7 8
| > T1 <- data.frame(Num=c('1','2'),
+ A01=c(0,2),A02=c(0,0),
+ B01=c(0,1),B02=c(2,0),
+ CC=c('001','002'))
> T1
Num A01 A02 B01 B02 CC
1 1 0 0 0 2 001
2 2 2 0 1 0 002 |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| > library(reshape2)
> T2 <- melt(T1,
+ id.vars=c('Num','CC'),
+ mesure.vars=c('A01':'B02'),
+ value.name="NB")
> T2
Num CC variable NB
1 1 001 A01 0
2 2 002 A01 2
3 1 001 A02 0
4 2 002 A02 0
5 1 001 B01 0
6 2 002 B01 1
7 1 001 B02 2
8 2 002 B02 0 |
Vous devriez aboutir à vos fins à partir du dataframe T2.
Cordialement,
Traitements selon le nom des colonnes
Bonjour,
La fonction melt() transpose les données. Maintenant il vous suffit de tester la valeur de variable pour multiplier NB par 2 si besoin et supprimer les lignes où NB=0.
Cordialement,
Traitements selon le nom des colonnes
Ce livre est vraiment très bien fait avec le code SAS, son équivalent en R et souvent le résultat des fonctions R. Il n'est pas vraiment nécessaire de parler anglais. Un index reprend le nom des fonctions SAS et R.
Cordialement,