Indexation enregistrements ordonnés sans boucle

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Anne Relun
Messages : 18
Enregistré le : 19 Juin 2013, 13:00

Indexation enregistrements ordonnés sans boucle

Messagepar Anne Relun » 28 Aoû 2013, 16:54

Bonjour à tous,

Je souhaite indexer des enregistrements d'une colonne, les lignes étant ordonnées selon une autre.
Par exemple, si j'ai

Code : Tout sélectionner

test <- read.table(textConnection("
ID Com Weight
888 50 1
889 18 1
890 5 2
891 5 2
892 6 2
893 6 2
894 25 4
895 25 4
896 25 4
897 25 4
"
),sep=" ",h=T) 

avec les lignes ordonnées selon les valeurs de la variable "Weight", et je veux indexer les lignes avec un nouveau numéro dès qu'on passe à une nouvelle communauté "Com", cad avoir le résultat

Code : Tout sélectionner

>  test
    ID Com Weight Index
1  888  50      1     1
2  889  18      1     2
3  890   5      2     3
4  891   5      2     3
5  892   6      2     4
6  893   6      2     4
7  894  25      4     5
8  895  25      4     5
9  896  25      4     5
10 897  25      4     5


j'y arrive en passant par une boucle

Code : Tout sélectionner

test$Index <- 1
for (i in 1:(nrow(test)-1)){
  j <- i + 1
  k <- test[i,]$Index
  test[j,]$Index <- ifelse (test[j,]$Com != test[i,]$Com, k + 1, k)
}


mais je me dis qu'il y a peut-être plus simple ?

Merci d'avance pour vos réponses.

Anne

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Messagepar Aurélien Madouasse » 28 Aoû 2013, 18:15

Bonsoir Anne,

Une manière de faire:

Code : Tout sélectionner

test$Index <- match(test$Com, unique(test$Com))

En espérant que tout va commme tu veux.

Aurélien

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 29 Aoû 2013, 07:28

Bonjour,

la solution d'Aurélien marche très bien s'il n'y a pas de répétition de Com (toutes les suites sont différentes). Si ce n'est pas le cas tu peux faire comme ça :

Code : Tout sélectionner

test <- read.table(textConnection("
ID Com Weight
888 50 1
889 18 1
890 5 2
891 5 2
892 6 2
893 6 2
894 25 4
895 25 4
896 25 4
897 25 4
898 5 5
"
),sep=" ",h=T) 

rle1 <- rle(test$Com)
test$Index <- rep(seq.int(1,length(rle1$lengths)), rle1$lengths)

# avec le match :
test$Index_match <- match(test$Com, unique(test$Com))

test
    ID Com Weight Index Index_match
1  888  50      1     1           1
2  889  18      1     2           2
3  890   5      2     3           3
4  891   5      2     3           3
5  892   6      2     4           4
6  893   6      2     4           4
7  894  25      4     5           5
8  895  25      4     5           5
9  896  25      4     5           5
10 897  25      4     5           5
11 888   5      5     6           3
Cdlt

Anne Relun
Messages : 18
Enregistré le : 19 Juin 2013, 13:00

Messagepar Anne Relun » 29 Aoû 2013, 08:06

Super,

Merci à tous les deux.
La solution d'Aurélien me va bien car je n'ai effectivement pas de répétition de Com, mais la solution de Maxime est toujours bonne à connaitre pour un cas plus général.

A +

Anne

PS : Aurélien, oui tout va bien. Je commence à bien apprécier R et l'étendue de ses capacités même si j'ai vraiment l'impression d'apprendre une autre langue avec de bonnes heures de prises de tête pour comprendre comment faire (c'est ça quand on n'a pas une Anne L. sous la main ...)


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité