Ordonner un tableau selon un autre de taille différente

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

Benjamin Yguel
Messages : 10
Enregistré le : 16 Juin 2011, 10:46

Ordonner un tableau selon un autre de taille différente

Messagepar Benjamin Yguel » 30 Nov 2013, 21:19

Bonjour,

Afin de réaliser une analyse particulière qui necessite cette condition, je cherche à ordonner plusieurs tableaux de données, (où chaque ligne étant une espèce, la première colonne etant composée des noms de chaque espèce, et les autres colonnes des traits qualitatifs pour ces espèces) selon un seul autre tableau dont la première colonne est aussi composée des noms d'espèces mais malheureusement pas dans le même ordre et parfois contenant plus d'espèces que les tableaux à ordonner.

Ayant un gros jeux de données, je ne veux pas le faire manuellement.

Quelqu'un aurait il une solution ?

En vous remericant par avance,

B.

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 01 Déc 2013, 07:53

Il nous faut un extrait de vos données. Voir les post-it du forum.
Renaud

Benjamin Yguel
Messages : 10
Enregistré le : 16 Juin 2011, 10:46

Messagepar Benjamin Yguel » 01 Déc 2013, 12:28

Voila un exemple des tableaux à ordonner

Plot_ID Species_name
1 Aster_tripolium
1 Chenopodium_rubrum
1 Juncus_bufonius
1 Ranunculus_sceleratus
1 Bolboschoenus_maritimus
1 Schoenoplectus_tabernaemontani
1 Tephroseris_palustris
1 Spergularia_marina
1 Typha_angustifolia
1 Typha_latifolia
1 Puccinellia_distans
7 Aster_tripolium
7 Juncus_bufonius
7 Puccinellia_maritima
7 Puccinellia_rupestris
7 Ranunculus_sceleratus
7 Bolboschoenus_maritimus
7 Tephroseris_palustris
7 Spergularia_marina
7 Typha_angustifolia
7 Typha_latifolia


Et voilà un exemple du tableau de base qui doit me servir de modèle, donc les tableaux ci dessus doivent être ordonnés comme le tableau ci dessous

SpsPhylo
Nuphar_lutea
Nymphaea_candida
Nymphaea_alba
Abutilon_theophrasti
Althaea_officinalis
Malva_alcea
Malva_neglecta
Malva_pusilla
Malva_sylvestris
Malva_moschata
Tilia_cordata
Tilia_platyphyllos
Tilia_xvulgaris
Daphne_mezereum
Carduus_crispus
Carduus_nutans
Carduus_acanthoides
Carduus_tenuiflorus
Alliaria_petiolata
Coronopus_didymus
Coronopus_squamatus
Thlaspi_caerulescens
Thlaspi_arvense
Thlaspi_perfoliatum
Arabis_hirsuta


Merci encore pour votre aide !

BY.

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Messagepar Jean-Emmanuel Longueville » 02 Déc 2013, 07:20

Réponse peut être trivial l'ordre et important ou vous devez juste avoir le même partout ?

Si vous avez besoin du même partout le plus simple est d'utiliser l'ordre alphabétique pour tous vos tableaux en triant vos données sur la même colonne.
Jean-Emmanuel
Ingénieur d'étude LNEC

Pierre COLIN
Messages : 350
Enregistré le : 03 Juil 2011, 11:04

Messagepar Pierre COLIN » 02 Déc 2013, 07:47

bonjour,

quelque chose en deux étapes, d'abord récupérer les numéros de lignes correspondantes dans la 2e table, puis ordonner la première avec la fonction order

Code : Tout sélectionner

### Table à trier
data=structure(list(Plot_ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L), Species_name = c("Aster_tripolium",
"Chenopodium_rubrum", "Juncus_bufonius", "Ranunculus_sceleratus",
"Bolboschoenus_maritimus", "Schoenoplectus_tabernaemontani",
"Tephroseris_palustris", "Spergularia_marina", "Typha_angustifolia",
"Typha_latifolia", "Puccinellia_distans", "Aster_tripolium",
"Juncus_bufonius", "Puccinellia_maritima", "Puccinellia_rupestris",
"Ranunculus_sceleratus", "Bolboschoenus_maritimus", "Tephroseris_palustris",
"Spergularia_marina", "Typha_angustifolia", "Typha_latifolia"
)), .Names = c("Plot_ID", "Species_name"), class = "data.frame", row.names = c(NA,
-21L))
### Table de référence
data2=structure(c("Typha_latifolia", "Spergularia_marina", "Coronopus_squamatus",
"Typha_angustifolia", "Tilia_xvulgaris", "Abutilon_theophrasti",
"Schoenoplectus_tabernaemontani", "Chenopodium_rubrum", "Tilia_platyphyllos",
"Nymphaea_alba", "Puccinellia_distans", "Aster_tripolium", "Malva_neglecta",
"Malva_sylvestris", "Malva_pusilla", "Tephroseris_palustris",
"Alliaria_petiolata", "SpsPhylo", "Carduus_acanthoides", "Carduus_tenuiflorus",
"Malva_alcea", "Althaea_officinalis", "Ranunculus_sceleratus",
"Thlaspi_caerulescens", "Puccinellia_rupestris", "Thlaspi_arvense",
"Juncus_bufonius", "Carduus_crispus", "Bolboschoenus_maritimus",
"Tilia_cordata", "Puccinellia_maritima", "Nymphaea_candida",
"Malva_moschata", "Carduus_nutans", "Nuphar_lutea", "Daphne_mezereum",
"Thlaspi_perfoliatum", "Arabis_hirsuta", "Coronopus_didymus"), .Dim = c(39L,
1L))

ind=rep(0,nrow(data))
for(i in 1:nrow(data)){
   cat(i,"\n")
   ### On récupère la position de l'espèce dans la table de référence
   ind[i]=which(data2[,1]==data[i,"Species_name"])
}
data=data[order(ind),]


Pierre

Benjamin Yguel
Messages : 10
Enregistré le : 16 Juin 2011, 10:46

Messagepar Benjamin Yguel » 02 Déc 2013, 08:15

Merci beaucoup pour vos réponses !

Non, je ne peux malheureusement pas les ranger par ordre alphabétique mais bien selon une liste particulière. J'ai omis de préciser que le jeu de donnée de référence est une phylogénie et donc ne peux pas être ranger par ordre alphabétique.

Il me semblait que je devais utiliser une fonction avec which mais sans savoir la synthaxe.

Je teste et vous redis.

Encore merci !

BY

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Messagepar Serge Rapenne » 02 Déc 2013, 09:45

Bonjour,

Il semble que ceci fonctionne (pas comme ma réponse précédente avec match que j'ai donc effacé)

Code : Tout sélectionner

data2<-data.frame(Species_name=data2)

data_trie<-merge(data2,data,by.x="Species_name",by.y="Species_name",sort=F)
> data_trie
                     Species_name Plot_ID
1                 Typha_latifolia       7
2                 Typha_latifolia       1
3              Spergularia_marina       7
4              Spergularia_marina       1
5              Typha_angustifolia       1
6              Typha_angustifolia       7
7  Schoenoplectus_tabernaemontani       1
8              Chenopodium_rubrum       1
9             Puccinellia_distans       1
10                Aster_tripolium       1
11                Aster_tripolium       7
12          Tephroseris_palustris       1
13          Tephroseris_palustris       7
14          Ranunculus_sceleratus       1
15          Ranunculus_sceleratus       7
16          Puccinellia_rupestris       7
17                Juncus_bufonius       7
18                Juncus_bufonius       1
19        Bolboschoenus_maritimus       1
20        Bolboschoenus_maritimus       7
21           Puccinellia_maritima       7


Serge

Benjamin Yguel
Messages : 10
Enregistré le : 16 Juin 2011, 10:46

Messagepar Benjamin Yguel » 02 Déc 2013, 11:16

Merci pour vos réponses.

Je suis un peu perdu:

je n'arrive pas à utiliser vos scripts. Mes données se trouvent dans des matrices (fichier txt la 1ère colonne de chaque matrice contient les noms des espèces).

J'avais donc essayer d'utiliser directement vos scirpts mais visiblement il doit y avoir un problème de format. Jje crois avoir des matrices et il me semble que vos scripts sont fait pour manipuler des data.frame.
Par ailleurs, je ne comprends pas à quoi sert la fonction structure.

Et je ne peux pas les recodés (comme dans le 1ère exemple) car j'ai beaucoup trop d'espèces à recopier.

Voilà la sortie de R quand je les ouvre

mon fichier à ordonner

Species_Name X1 X7 X8 X11 X12 X13 X16 X18 X27
1 Acer_platanoides 0 0 0 0 0 0 0 0 0
2 Acer_pseudoplatanus 0 0 0 0 0 0 0 0 0
3 Achillea_millefolium 0 0 0 0 0 0 0 0 0
4 Achillea_ptarmica 0 0 0 0 0 0 0 0 0
5 Acorus_calamus 0 0 0 0 0 0 0 0 0
6 Actaea_spicata 0 0 0 0 0 0 0 0 0
7 Aegopodium_podagraria 0 0 0 0 0 0 0 2 0
8 Agrimonia_eupatoria 0 0 0 0 0 0 0 0 0
9 Agrostis_canina 0 0 0 0 0 0 0 0 3
10 Agrostis_capillaris 0 0 0 0 0 0 3 0 0

Mon fichier de référence

SpsPhylo
1 Nuphar_lutea
2 Nymphaea_candida

etc....

Quelqu'un peut m'expliquer ?

Encore merci,

BY

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Messagepar Serge Rapenne » 02 Déc 2013, 11:59

Comment importes tu tes données. Si c'est avec read.table, cette fonction crée des data frame.
Que donne str(donnees1) et str(donnee2) ou donnee1 et donnee2 sont les noms de tes objets

Serge

Benjamin Yguel
Messages : 10
Enregistré le : 16 Juin 2011, 10:46

Messagepar Benjamin Yguel » 02 Déc 2013, 12:20

Je les ouvre avec read.table et j'ai verifié avec str(), et donc ce sont bien des data.frame.


Pouvez vous m'expliquer où est le problème avec le première exemple et avec le votre ?

Encore merci !

BY

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Messagepar Serge Rapenne » 02 Déc 2013, 13:17

Sans les jeu de données, c'est difficile de faire un diagnostique (il faudrait fournir la sortie de dput pour les 2 fichiers ou un extrait si le fichier est trop gros).
Il faudrait plus d'info sur ce qui ne fonctionne pas, tu as un message d'erreur, si oui lequel ? le résultat n'est pas celui attendu ?

Serge

Benjamin Yguel
Messages : 10
Enregistré le : 16 Juin 2011, 10:46

Messagepar Benjamin Yguel » 02 Déc 2013, 13:32

Toutes mes excuses !

J'ai modifié mon fichier entre hier et aujourd'hui.

Le fichier à ordonner est donc différents mais le fichiers de références est le même (sauf que le nom des espèce est dans la 2ème colonne).

J'ai modifié mon tableau afin d'avoir une seule liste d'espèce, qui n'est plus répétée pour chaque plot et avoir ainsi mes plots dans chaque colonne.
Mes plots sont donc mes colonnes, de la colonne 2 à nbre de plot (ou chaque plot est indiqué par un numéro X1, X7 etc...), et ma première colonne est ma liste d'espèce.

Encore toutes mes excuses pour ce cafouillage!

Je remets un exemple de mes fichiers (copié depuis R):
Le tableau de référence
Number SpsPhylo
1 1 Nuphar_lutea
2 2 Nymphaea_candida
3 3 Nymphaea_alba
4 4 Abutilon_theophrasti
5 5 Althaea_officinalis
6 6 Malva_alcea
7 7 Malva_neglecta
etc....
le tableau à ordonner de la même manière

Species_Name X1 X7 X8 X11 X12 X13 X16 X18 X27
1 Acer_platanoides 0 0 0 0 0 0 0 0 0
2 Acer_pseudoplatanus 0 0 0 0 0 0 0 0 0
3 Achillea_millefolium 0 0 0 0 0 0 0 0 0
4 Achillea_ptarmica 0 0 0 0 0 0 0 0 0
5 Acorus_calamus 0 0 0 0 0 0 0 0 0
6 Actaea_spicata 0 0 0 0 0 0 0 0 0
7 Aegopodium_podagraria 0 0 0 0 0 0 0 2 0
etc....

Encore toute mes excuses!

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Messagepar Serge Rapenne » 02 Déc 2013, 15:26

Si ton tableau de données s'appelle Data et que ton tableau de référence s'appelle Ref.

mon code s’écrit

Code : Tout sélectionner

data_trie<-merge(Ref,Data,by.x="SpsPhylo",by.y="Species_name",sort=F)


La colonne Number de la table de référence, m'a donnée l'idée d'une autre approche

Code : Tout sélectionner

liste_ordre<-Ref$Number[match(Ref$SpsPhylo,Data$Species_name)]
data_trie<-Data[order(liste_ordre),]


Serge

Benjamin Yguel
Messages : 10
Enregistré le : 16 Juin 2011, 10:46

Messagepar Benjamin Yguel » 02 Déc 2013, 15:42

La forme des données n'était pas en cause...

J'ai réussi finalement à faire fonctionner votre script.

J'utilisais les mauvais titres de colonne....... c'est nul.... Mes excuses...

Concernant le premier script, cela ne fonctionne pas pour le moment.

Le message d'erreur est le suivant:
l'argument de remplacement est de longueur nulle

Encore merci pour votre aide et désolé pour le temps perdu...

BY

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Messagepar Serge Rapenne » 02 Déc 2013, 16:01

Qd tu dis "le 1er script", il s'agit de mon code avec merge ou du code de Pierre COLIN ?


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité