Creer une fonction pour charger un fichier d'une autre application?

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 Leduc
Messages : 158
Enregistré le : 09 Avr 2010, 08:48

Creer une fonction pour charger un fichier d'une autre application?

Messagepar Benjamin Leduc » 03 Fév 2019, 16:38

Bonjour,

Je cherche à faire une fonction pour importer un fichier et le modifier pour en faire sortir une table sous R. Ma question est double:

Comment charger le dit texte pour en faire ce que je souhaite sous R?

Ensuite, ce que je souhaite faire pour la mise en forme nécessite (en bash):

Code : Tout sélectionner

awk 'BEGIN{FS=" "}{if(/^[0-9]/){print $1,$4}}' file.txt \
    | awk 'BEGIN{FS="_"}{print $1}' \
    | sort \
    | uniq -c \
    | sed 's/ \+//' \
    | awk 'BEGIN{FS=" "}{print $2,$3,$1}'


Comment traduire ça en R? Merci d'avance
Je dois être Suicide-R

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Creer une fonction pour charger un fichier d'une autre application?

Messagepar Pierre-Yves Berrard » 04 Fév 2019, 09:27

Bonjour,
Benjamin Leduc a écrit :Comment charger le dit texte pour en faire ce que je souhaite sous R?

Selon la structure du fichier texte, voir les fonctions read.table (et ses petites soeurs read.csv, read.delim...), readLines, ...

Benjamin Leduc a écrit :Ensuite, ce que je souhaite faire pour la mise en forme nécessite (en bash):

Code : Tout sélectionner

awk 'BEGIN{FS=" "}{if(/^[0-9]/){print $1,$4}}' file.txt \
    | awk 'BEGIN{FS="_"}{print $1}' \
    | sort \
    | uniq -c \
    | sed 's/ \+//' \
    | awk 'BEGIN{FS=" "}{print $2,$3,$1}'

Comment traduire ça en R? Merci d'avance

Je ne parle pas couramment le bash, pourriez-vous décrire les transformations à faire en français ?
PY

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

Re: Creer une fonction pour charger un fichier d'une autre application?

Messagepar Serge Rapenne » 04 Fév 2019, 12:57

Bonjour,

Comme Pierre-Yves, je suis loin d'être un pro de awk et consort. Pouvez vous fournir un exemple du format de fichier d'entrée et indiquer ce qu'il faut récupérer dedans.

Serge

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Creer une fonction pour charger un fichier d'une autre application?

Messagepar Mickael Canouil » 05 Fév 2019, 08:10

Bonjour,

les commandes de R (base) dont vous avez a priori besoin:

Code : Tout sélectionner

?grep
?gsub
?unique
?sort
?scan
?read.table
?strsplit


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Benjamin Leduc
Messages : 158
Enregistré le : 09 Avr 2010, 08:48

Re: Creer une fonction pour charger un fichier d'une autre application?

Messagepar Benjamin Leduc » 07 Fév 2019, 12:10

Bonjour,

désolé d'avoir été long à répondre…

Alors mon fichier d'entré est comme ça:

Code : Tout sélectionner

>Cluster 0
0   586nt, >Sb-40_M02764:115:000000000-C3GKK:1:2104:21327:3911... *
>Cluster 1
0   585nt, >Sb-40_M02764:115:000000000-C3GKK:1:1114:8463:18775... *
>Cluster 2
0   576nt, >Sb-40_M02764:115:000000000-C3GKK:1:2105:22461:19974... *
>Cluster 3
0   570nt, >Sb-40_M02764:115:000000000-C3GKK:1:2106:17690:17266... *
>Cluster 4
0   568nt, >Sb-40_M02764:115:000000000-C3GKK:1:1113:19587:14016... *
>Cluster 5
0   568nt, >Sb-40_M02764:115:000000000-C3GKK:1:2119:10036:22264... *
>Cluster 6
0   567nt, >Sb-40_M02764:115:000000000-C3GKK:1:1115:26765:13543... *
>Cluster 7
0   567nt, >Sb-40_M02764:115:000000000-C3GKK:1:2119:22844:21138... *
>Cluster 8
0   563nt, >Sb-40_M02764:115:000000000-C3GKK:1:2114:20598:6817... *
>Cluster 9
0   561nt, >Sb-40_M02764:115:000000000-C3GKK:1:2118:12645:5112... *
>Cluster 10
0   560nt, >Sb-40_M02764:115:000000000-C3GKK:1:1118:26982:18492... *
>Cluster 11
0   559nt, >Sj-A_M02764:115:000000000-C3GKK:1:1111:19695:21661... *
>Cluster 12
0   558nt, >Sj-A_M02764:115:000000000-C3GKK:1:1118:14442:3418... *
>Cluster 13
0   558nt, >Sb-40_M02764:115:000000000-C3GKK:1:2107:6938:12738... *
>Cluster 14
0   550nt, >Sb-40_M02764:115:000000000-C3GKK:1:1108:23688:21262... at 1:550:1:558/+/81.45%
1   558nt, >Sb-40_M02764:115:000000000-C3GKK:1:2106:25297:19809... *


Et je souhaite une table comme ça:

Code : Tout sélectionner

   Sb-40   Sj-A
1   1   0
2   1   0
3   1   0
4   1   0
5   1   0
6   1   0
7   1   0
8   1   0
9   1   0
10   1   0
11   0   1
12   0   1
13   1   0
14   2   0


J'ai commencé à trouver certaines chose, mais ça n'est pas encore au point …
Je dois être Suicide-R

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Creer une fonction pour charger un fichier d'une autre application?

Messagepar Mickael Canouil » 07 Fév 2019, 12:30

Bonjour,

le fichier 'file.txt' contient exactement ce que vous avez indiquez ? avec les chevrons, etc ?

Code : Tout sélectionner

>Cluster 0
0   586nt, >Sb-40_M02764:115:000000000-C3GKK:1:2104:21327:3911... *
>Cluster 1
0   585nt, >Sb-40_M02764:115:000000000-C3GKK:1:1114:8463:18775... *
>Cluster 2
0   576nt, >Sb-40_M02764:115:000000000-C3GKK:1:2105:22461:19974... *
>Cluster 3
0   570nt, >Sb-40_M02764:115:000000000-C3GKK:1:2106:17690:17266... *
...


Que renvoie le résultat de 'readLines(con = "file.txt", n = 20)' ?
Mickaël
mickael.canouil.fr | rlille.fr

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

Re: Creer une fonction pour charger un fichier d'une autre application?

Messagepar Serge Rapenne » 07 Fév 2019, 16:10

Bonjour,

Si le format est bien celui décrit, ceci devrait faire ce que tu cherches :

Code : Tout sélectionner

library(tidyr)

dta<-readLines("/home/script2/code_R/tmp/file.txt")
 
 ligne_cluster<-grep("Cluster",dta) #on cherche les lignes contenant Cluster
 l_dta<-setdiff(1:length(dta),ligne_cluster) #liste des lignes ne contenant pas cluster
 cluster<-c(0,cumsum(diff(l_dta)-1)) #on construit une liste des cluster

 dta2<-data.frame(A=dta[-ligne_cluster])
 dta3<-dta2 %>% separate(A,c("B","C","D"),sep=">|_") #pour les ligne ne contenant pas cluster on decoupe le champs texte avec > et _ comme separateur
 
 tmp<-data.frame(cluster=cluster,ID=dta3$C) %>% group_by(cluster,ID) %>% summarise(nb=n()) #on calcul le nb d’élément par groupe
 
 resu <-tmp %>% spread(ID,nb,fill=0) #on passe du format long au format large
 resu
# A tibble: 15 x 3
# Groups:   cluster [15]
   cluster `Sb-40` `Sj-A`
     <dbl>   <dbl>  <dbl>
 1       0       1      0
 2       1       1      0
 3       2       1      0
 4       3       1      0
 5       4       1      0
 6       5       1      0
 7       6       1      0
 8       7       1      0
 9       8       1      0
10       9       1      0
11      10       1      0
12      11       0      1
13      12       0      1
14      13       1      0
15      14       2      0


Serge

Benjamin Leduc
Messages : 158
Enregistré le : 09 Avr 2010, 08:48

Re: Creer une fonction pour charger un fichier d'une autre application?

Messagepar Benjamin Leduc » 07 Fév 2019, 18:38

Merci… J'essaye au plus vite… Je suis HS après une dure journée de labo…
Je dois être Suicide-R

Benjamin Leduc
Messages : 158
Enregistré le : 09 Avr 2010, 08:48

Re: Creer une fonction pour charger un fichier d'une autre application?

Messagepar Benjamin Leduc » 08 Fév 2019, 13:59

Merci, ça marche, il manque juste un petit "library(dplyr)" , mais j'ai trouvé ;)
Je dois être Suicide-R


Retourner vers « Questions en cours »

Qui est en ligne

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