trier des chaines de caracteres et inserer un caractere

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

Jamila CHAIB
Messages : 9
Enregistré le : 05 Juil 2007, 02:13

trier des chaines de caracteres et inserer un caractere

Messagepar Jamila CHAIB » 20 Mar 2008, 02:38

Bonjour,

j'aurais besoin d'aide pour creer une fonction qui trierait les donnees de type "character" d'une colonne d'un dataframe et remplacerait le contenu selon le nombre et la valeur du(des) caractere(s).

Pour etre plus claire, voici mon example:
ASSAY SAMPLE GENOTYPE
M1 01 A
M2 01 C
M3 01 TC
M1 02 A
M2 02 C
M3 02 TC
M1 03 A
M2 03 TC
M3 03 TC
M1 04 CA
M2 04 C
M3 04 TC
M1 05 CA
M2 05 C
M3 05 TC


je voudrais trier la colonne GENOTYPE pour:
- remplacer les nchar=1 par deux fois la valeur du caractere: ex= A par AA, C par CC, etc...
- remplacer les nchar=2 par "caractere1/caractere2", soit inserer un / entre les deux caracteres: ex=TC par T/C, CA par C/A, ...

et pouvoir appliquer cette fonction dans le cas ou j'aurais plusieurs colonnes de type GENOTYPE.

J'image qu'on doit pouvoir combiner nchar() et replace() du genre

Code : Tout sélectionner

if (nchar(example$GENOTYPE_ID)=1) replace(example, example=x, xx)
if (nchar(example$GENOTYPE_ID)=2) replace(example, example=xy, x/y)

mais, comme vous pouvez le voir, je suis carrement incompetente en programmation

Merci d'avance.
Jam.

Olivier Delaigue
Messages : 220
Enregistré le : 05 Déc 2006, 07:38

Messagepar Olivier Delaigue » 20 Mar 2008, 07:24

Par exemple (il y a certainement plus simple) :

Code : Tout sélectionner

test <- c("A", "C", "CA", "T", "CT")

myvector <- NULL
for(i in test) {
  if(nchar(i) == 1) mychar <- paste(i, i, sep = "")
  if(nchar(i) == 2) mychar <- paste(substr(i, 1,1), "/", substr(i, 2,2), sep = "")
  myvector <- c(myvector, mychar)
}

myvector
[1] "AA"  "CC"  "C/A" "TT"  "C/T"

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

Messagepar Logez Maxime » 20 Mar 2008, 08:54

Bonjour,

On peut peut-être faire plus simple en évitant la boucle mais je ne sais pas si le temps de calcul en est réduit (je ne l'ai pas testé). Le code suivant recherche dans ton tableau quels sont les colonnes qui commencent par le mot GENOTYPE et les transforme comme tu voulais : 1 caractère, on le duplique, et deux caractères on insère un "/" au milieu des deux.

Code : Tout sélectionner

exemple <- function(x){
  # x le tableau
  auxi <- grep("^GENOTYPE",colnames(x))
  x[,auxi] <- apply(x[,auxi,drop=FALSE],2,function(w)
    ifelse(nchar(w)==1,paste(w,w,sep=""),
    paste(substring(w,1,1),"/",substring(w,2,2),sep="")))
  x
  }

test <- data.frame(x=rnorm(10),y=runif(10),GENOTYPE=letters[1:10],stringsAsFactors=FALSE)
test$GENOTYPE[c(3,7,9)] <- with(test,paste(GENOTYPE[c(3,7,9)],GENOTYPE[c(3,7,9)],sep=""))

test
             x          y GENOTYPE
1  -0.32900909 0.29239760        a
2   0.27330660 0.26987359        b
3   0.28548215 0.18919394       cc
4  -0.02001911 0.09830206        d
5   0.84026668 0.49998397        e
6   0.13017161 0.87730255        f
7   0.63615724 0.35928905       gg
8   0.97918984 0.71264367        h
9  -0.81088082 0.67019062       ii
10 -0.32805354 0.57698835        j

exemple(test)
             x          y GENOTYPE
1  -0.32900909 0.29239760       aa
2   0.27330660 0.26987359       bb
3   0.28548215 0.18919394      c/c
4  -0.02001911 0.09830206       dd
5   0.84026668 0.49998397       ee
6   0.13017161 0.87730255       ff
7   0.63615724 0.35928905      g/g
8   0.97918984 0.71264367       hh
9  -0.81088082 0.67019062      i/i
10 -0.32805354 0.57698835       jj


Maxime

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Messagepar François Bonnot » 20 Mar 2008, 17:06

Ou encore :

Code : Tout sélectionner

test <- c("A", "C", "CA", "T", "CT")
ifelse(nchar(test)>1,sub("([[:alnum:]])([[:alnum:]])","\\1/\\2",test),paste(test,test,sep=""))
[1] "AA"  "CC"  "C/A" "TT"  "C/T"


FB

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

Messagepar Logez Maxime » 21 Mar 2008, 08:36

Re,

Juste pour info, François, est-ce que tu pourrais me donner des références ou des sites web pour comprendre les expressions régulières. J'ai bien essayer de trouver de l'info sur le web mais pour le moment rien de concluant.

Merci

Maxime

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Messagepar François Bonnot » 21 Mar 2008, 09:45

Logez Maxime a écrit :Juste pour info, François, est-ce que tu pourrais me donner des références ou des sites web pour comprendre les expressions régulières. J'ai bien essayer de trouver de l'info sur le web mais pour le moment rien de concluant.

Je n'ai pas cherché sur le web, mais j'ai trouvé les infos nécessaires sur l'aide dans regexp {base}, et des exemples dans les fonctions associées (sub, gsub, grep...). Il faut tâtonner un peu pour comprendre mais c'est très puissant.

FB

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

Messagepar Logez Maxime » 21 Mar 2008, 10:02

re,

En effet c'est très puissant j'ai déjà vu pas mal d'applications de ces expressions régulières sur la R-help et c'ets a chaque fois surprenant.

merci pour l'info.

Maxime

Jamila CHAIB
Messages : 9
Enregistré le : 05 Juil 2007, 02:13

Messagepar Jamila CHAIB » 24 Mar 2008, 23:23

Merci a tous. Vos differents exemples m'aident a comprendre un peu plus la logique mais il est clair que je n'y serais pas arrivee seule...
Jam.


Retourner vers « Questions en cours »

Qui est en ligne

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