Quelques traitements simples ?

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

Abdel Zine
Messages : 75
Enregistré le : 28 Nov 2006, 09:56

Quelques traitements simples ?

Messagepar Abdel Zine » 23 Jan 2007, 17:31

Bonjour,
Voici quelques traitements très simples que je voudrais effectuer en utilisant R, mais je trouve des difficultés. Mes données en entrées (fichiers .csv ou xml) sont produits par un logiciel de simulation :

Soit le fichier nb_steps.csv suivant
1544 1999 1999 1115 1633


Le nombre de valeurs est égal à une variable nbRuns (le nombre de simulations effectuées).

La valeur max que peuvent prendre ces valeurs dans cet exemple est nbSteps-1, le nombre maximum de pas d’une simulation (ici nbSteps = 2000).
Les valeurs inférieures à 1999 dans mon exemple sont dites convergentes.

Je cherche à faire des stats simples sur le contenu de ce fichier :
• Le pourcentage d’exécution ayant convergées : D’abord connaître le pourcentage des valeurs convergentes (strictement inférieures à nbSpets-1) :

Càd traitement :

Code : Tout sélectionner

   Conv()
   {
   nbConv  0
   Parcourir le fichier <nb_steps.csv>   // exemple de nb_steps.csv plus haut
   Si « valeur courante » est_inférieure à « nbSteps-1 » alors
      nbConv <- nbConv + 1
   jusqu’à Eof (end of file)
   conv <- (nbConv/nbRuns)* 100
}

Ce qui donnera pour mon exemple 3/5 = 60 %

Mais au lieu de réécrire cette fonction (bien que le calcul soit très simple), il doit y avoir une fonction sous R qui le fait ?


• Stat sur nombre de pas pour converger : (min | médiane | max || moyenne | écart type) :
Là je ne veux prendre en compte que les valeurs < 1999, et extraire leur min, méd, max, moy et écart-type de ces valeurs :


- >> min = 1115, med (médiane) = 1544 et max = 1633
- >> moy (moyenne arithmétique) = 1430.67
- >> variance = sigma(xi2/n)- moy2 =
- >> écart-type (ET) = racine(variance)

Ce qui est donné en majorité par la fonction summary(), mais celle-ci considère les valeurs des différentes colonnes comme autant de variables différentes alors que mon fichier est un vecteur ligne d’une seule variable.

> mySteps <- read.csv("nb_steps.csv", header =FALSE, sep = "", dec=".")
> mySteps
V1 V2 V3 V4 V5
1 1544 1999 1999 1115 1633
>


En ordonnant (manuellement) les valeurs sur la même colonne les valeurs ne sont pas lues correctement :

> mySteps2 <- read.csv("nb_steps2.csv", header =FALSE, sep = "\n", dec=".")
> mySteps2
V1
1 ÿþ1
2 \n1115
3 \n1633
4 \n
5 \n
>


Une idée sur la façon de procéder pour avoir des calculs corrects ?
Merci
Nul ne peut atteindre l'aube sans passer par le chemin de la nuit. Khalil Gibran.

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

Messagepar Renaud Lancelot » 23 Jan 2007, 18:57

1. Il suffit d'utiliser les opérateurs de comparaison:

Code : Tout sélectionner

> nbSteps <- 2000
> mySteps <- c(1544, 1999, 1999, 1115, 1633)
>
> mySteps < nbSteps - 1
[1]  TRUE FALSE FALSE  TRUE  TRUE
>
> mean(mySteps < nbSteps - 1)
[1] 0.6


ça marche car les valeurs logiques sont évaluées comme 1 (TRUE) ou 0 (FALSE) dans les calculs arithmétiques.

2. Le pb vient de "read.csv": voir l'aide de cette fct. Il vaudrait mieux utiliser la fct "scan" dans votre cas car elle retourne un vecteur (alors que "read.csv" retourne un data.frame). Sinon, il suffit de transformer le résultat de "read.csv" en un vecteur, avec la fct "unlist" par exemple. Après, il suffit d'utiliser "summary" ou d'écrire une petite fct faisant exactement ce que vous voulez:

Code : Tout sélectionner

> myFun <- function(x) c(min = min(x),
+                        med = median(x),
+                        max = max(x),
+                        moy = mean(x),
+                        variance = var(x),
+                        "écart-type" = sd(x))
>
> myFun(mySteps[mySteps < nbSteps - 1])
       min        med        max        moy   variance écart-type
 1115.0000  1544.0000  1633.0000  1430.6667 76714.3333   276.9735


Renaud

Abdel Zine
Messages : 75
Enregistré le : 28 Nov 2006, 09:56

Messagepar Abdel Zine » 26 Jan 2007, 09:04

Bonjour,
Merci pour votre réponse.

1. Pourcentage
> ss <- scan("nb_steps.csv")
Read 5 items
> ss
[1] 1544 1999 1999 1115 1633
> ss < nbSteps-1
[1] TRUE FALSE FALSE TRUE TRUE
> mean(ss < nbSteps-1)
[1] 0.6


2. Stat sur nombre de pas pour converger : (min | médiane | max || moyenne | écart type)

> summary(ss)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1115 1544 1633 1658 1999 1999

Code : Tout sélectionner

> myFun <- function(x) c(min = min(x),
+ max = max(x),
+ med = median(x),
+ moy = mean(x),
+ "écart-type" = sd(x))


> myFun(ss)
min max med moy écart-type
1115.0000 1999.0000 1633.0000 1658.0000 367.7744

Mais je veux les stats sur les valeurs < 1999 seulement, comment introduire une sorte de « if » afin de prendre en compte que les 3 valeurs concernées (dans ce cas précis).

Pour avoir ces résultats :
> myFun(ss[ss < nbSteps - 1])
min max med moy écart-type
1115.0000 1633.0000 1544.0000 1430.6667 276.9735
>


Merci.
Nul ne peut atteindre l'aube sans passer par le chemin de la nuit. Khalil Gibran.

Abdel Zine
Messages : 75
Enregistré le : 28 Nov 2006, 09:56

Messagepar Abdel Zine » 28 Jan 2007, 21:21

Autres traitements dans le même sens :
Soit le fichier suivant, FinalTE1.csv ..
Image

.. qui est un tableau [nbRuns*nbRelations]

Je le mets dans une variable :

Code : Tout sélectionner

mydata <- read.csv("FinalTE.csv", header =FALSE,  sep = "", dec=".")

ce qui donne :
> mydata
V1 V2
1 2 1
2 8 8
3 -5 -6
4 -1 -1
5 -9 -9
>

[Petite question : Par défaut les colonnes ont les noms V1, V2 etc. est ce que je peux les renommer ? Il me semble que j'ai vu quelque chose dans ce sens en lisant la doc mais je ne retrouve pas.
Merci
]

Je veux avoir les mêmes stats que précédemment, càd ceux qu’effectue la fonction myFun

Code : Tout sélectionner

> myFun
function(x) c(min = min(x),
max = max(x),
med = median(x),
moy = mean(x),
"écart-type" = sd(x))
>

Je ne peux utiliser celle-ci, normal, puisque ce ne sont pas les mêmes types de données.
Je voudrais avoir son équivalent pour le type de données présent sur ce fichier. Quelles modifications apporter ?

La fonction summary() me fournit en partie ce que je veux, mais il me manque les moyennes et écarts-types, donc c’est une sorte d’extension de cette fonction qu’il me faut :

> summary(mydata)
V1 V2
Min. :-9 Min. :-9.0
1st Qu.:-5 1st Qu.:-6.0
Median :-1 Median :-1.0
Mean :-1 Mean :-1.4
3rd Qu.: 2 3rd Qu.: 1.0
Max. : 8 Max. : 8.0
>


Autre chose, je voudrais là aussi mettre une condition sur les valeurs (ici les lignes) à traiter, nbSteps < 1999. Comment procéder ?

Merci
Bonne soirée et bon début de semaine :)
Nul ne peut atteindre l'aube sans passer par le chemin de la nuit. Khalil Gibran.

Petra Nemcova Naked

rJbcVcVyovRb

Messagepar Petra Nemcova Naked » 29 Jan 2007, 08:06

<a href="http://www.bebo.com/RachelB1472">Rachel Bilson Nude</a>
Rachel Bilson Naked
<a href="http://en.netlog.com/rachel_stevens">Rachel Stevens Nude</a>
Rachel Stevens Naked
<a href="http://web.tickle.com/member/rihanna_news">Rihanna Nude</a>
Rihanna Naked
<a href="http://www.propeller.com/member/sarah_harding/">Sarah Harding Nude</a>
Sarah Harding Naked
<a href="http://www.youtube.com/user/shalondaceci">Scarlett Johansson Nude</a>
Scarlett Johansson Naked

Abdel Zine
Messages : 75
Enregistré le : 28 Nov 2006, 09:56

Messagepar Abdel Zine » 29 Jan 2007, 12:32

==
@E.V. Dennst : Je te remercie pour ta remarque, mais si je mets ces questions ensembles c'est bien parce qu'elles sont liées les unes aux autres, et jusque là j'ai eu les réponses que je souhaitais, j'en remercie leurs auteurs au passage.
==

Pour col/rownames : j'ai essayé avec cet exemple :
j'ai d'abord essayé ça :
> myTE
V1 V2
1 2 1
2 8 8
3 -5 -6
4 -1 -1
5 -9 -9

Code : Tout sélectionner

> rownames(myTE) <- rownames(myTE, do.NULL= FALSE, prefix="run.")

> myTE
V1 V2
1 2 1
2 8 8
3 -5 -6
4 -1 -1
5 -9 -9
>

Avec la deuxième méthode c'est bon :
>

Code : Tout sélectionner

rownames(myTE) <- c("run1", "run2", "run3", "run4", "run5")

> myTE
V1 V2
run1 2 1
run2 8 8
run3 -5 -6
run4 -1 -1
run5 -9 -9
>

Pourquoi la première méthode n'a pas marché ? Merci
Nul ne peut atteindre l'aube sans passer par le chemin de la nuit. Khalil Gibran.

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

Messagepar Logez Maxime » 30 Jan 2007, 11:08

Bonjour,


Pour ce qui est d'appliquer ta fonction a tes deux colonnes il te suffit de te servir de la fonction apply, de lui dire que tu travailles en colonne et que tu appliques myFun :

Code : Tout sélectionner

apply(mydata,2,myFunc)

Tu devrais obtenir ce que tu cherches mais sur tes deux colonnes, concernant les noms de ligne si ta première synthaxe ne marche pas c'est tout simplement parce que tes noms de lignes ne sont pas null essaie is.null(rownames(myTE)) et tu seras tout de suite. Sinon je te conseille d'utiliser la fonction paste :

Code : Tout sélectionner

paste("row",1:nrow(myTE),sep="")
rownames(myTE) <- paste("row",1:nrow(myTE),sep="")

surtout si tu as des tableaux relativement grands ... D'ailleurs si tu regardes l'aide de read.csv tu trouveras a row.names :
Otherwise if row.names is missing, the rows are numbered. Donc les noms de lignes quand tu incorpores un tableau avec read.csv sont numérotés et par conséquent non null ce qui fait que ta synthaxe marche pas.

Maxime

Abdel Zine
Messages : 75
Enregistré le : 28 Nov 2006, 09:56

Messagepar Abdel Zine » 30 Jan 2007, 21:44

Bonsoir,
Merci beaucoup maxime, en fait j'ai découvert ces deux fonctions apply et paste aujourd'hui et j'ai pu me familiariser avec, mais ce n'est que maintenant que j'ai pu me connecter sur le forum pour vous en faire part (problème d'accès momentané au furum toute la journée).

Donc, jusque là je peux effectuer le traitement sur toutes les lignes de myTE:
> myTE
Relation1 Relation2
run1 2 1
run2 8 8
run3 -5 -6
run4 -1 -1
run5 -9 -9
>

Code : Tout sélectionner

apply(mydata,2,myFun)

V1 V2
min -9.000000 -9.000000
max 8.000000 8.000000
med -1.000000 -1.000000
moy -1.000000 -1.400000
écart-type 6.519202 6.580274
Mais je voudrais le faire uniquement sur les lignes t.q. mySteps < nbSteps - 1
ce qui correspond aux lignes 1, 4 et 5 (voir les premiers posts de la discussion) :

Code : Tout sélectionner

> mySteps < nbSteps - 1

[1] TRUE FALSE FALSE TRUE TRUE


Je cherchais donc à introduire cette condition dans mon traitement, je ne trouvais toujours pas la bonne formule, mais là c'est bon :

>

Code : Tout sélectionner

myTE[mySteps < nbSteps - 1,] #extraction des lignes concernées

Relation1 Relation2
run1 2 1
run4 -1 -1
run5 -9 -9
>

Code : Tout sélectionner

 apply(myTE[mySteps < nbSteps - 1,],2,myFun) #bingo !

Relation1 Relation2
min -9.000000 -9.000000
max 2.000000 1.000000
med -1.000000 -1.000000
moy -2.666667 -3.000000
écart-type 5.686241 5.291503
>

Même si j'ai trouvé seul cette fois-ci je vous remercie énormément car j'avance très rapidement grâce au forum et je me débrouille de mieux en mieux :)
=====
PS: Une parenthèse concernant le changement des noms de colonnes, effectivement :
>

Code : Tout sélectionner

is.null(rownames(myTE))

[1] FALSE :
et je le sais bien qu'ils sont pas null puisqu'il sont positionnés à 1:5, mais je ne l'avais pas compris de cette façon, alors pour que ça marche il faudrait que do.NULL= T ?
Enfin c'est pas trop grave du moment que je le fais autrement.
Merci Maxime
Nul ne peut atteindre l'aube sans passer par le chemin de la nuit. Khalil Gibran.

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

Messagepar Logez Maxime » 31 Jan 2007, 08:25

Bonjour,

Pour ce qui est de ta sélection de lignes je ne vois pas d'autres solutions que celle que tu as utilisée. Concernant rownames encore une fois regarde l'aide :
do.NULL logical. Should this create names if they are NULL? Est-ce que ça va créer des noms s'ils sont nuls ? Ici la condition est donc que les rownames doivent être nuls pour que tu puisses les créer et ça n'a donc rien avoir avec un do.null=T. Car si tu mets do.null=T et tu as bien vu que ça changeait rien puisque de toute façon tes rownames ne satisfont pas la condition de nullité.

Maxime


Retourner vers « Questions en cours »

Qui est en ligne

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