datframe somme des valeurs associées à des millésimes

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

Wilfrid Car
Messages : 59
Enregistré le : 09 Avr 2015, 13:35

datframe somme des valeurs associées à des millésimes

Messagepar Wilfrid Car » 04 Mai 2015, 18:19

bonjour,
Je suis un peu perdu
j'ai un data.frame avec des années associées à des valeurs

années valeurs
1515 250
1515 120
1515 50
1517 350
1580 150
1580 70

comment arriver à un tableau qui présente la somme des valeurs par années
1515: 420 et ainsi de suite...
Je pensais utiliser la fonction tapply...



Merci d'avance....

Bien cordialement,

Wilfrid

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 04 Mai 2015, 19:15

Bonsoir,
tapply se décline comme ça :

Code : Tout sélectionner

tapply(data$valeurs, data$années,sum,na.rm=T)


Nicolas

Wilfrid Car
Messages : 59
Enregistré le : 09 Avr 2015, 13:35

Messagepar Wilfrid Car » 05 Mai 2015, 07:29

Bonjour,
Cela fonctionne en effet très bien,

Quelques remarques sur le barplot qui en découle

Selon mes observations:

Code : Tout sélectionner

 tapply(data$valeurs, data$années,sum,na.rm=T)


1) L'agument na.rm=T) employé dans la fonction tapply fait que toutes les années comportant des NA ne sont pas affichées comme des trous dans mon barplot;

2) Sans l'agument na.rm=T) employé dans la fonction tapply les années comportant au moins une valeur NA ne sont pas affichées...

Comment faire?

Bien cordialement

Wilfrid

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 05 Mai 2015, 07:37

Je ne suis pas sûr de comprendre

Un exemple reproductible :

Code : Tout sélectionner

barplot(tapply(c(1:5,rep(NA,5)),gl(2,5),sum,na.rm=TRUE))
barplot(tapply(c(1:9,NA),gl(2,5),sum,na.rm=TRUE))


Dans les 2 cas ci-dessus, on a un graphique comportant les 2 "années", bien que dans le premier il n'y ait que des NA dans la 2e année et dans le second cas un NA.

Wilfrid Car
Messages : 59
Enregistré le : 09 Avr 2015, 13:35

Messagepar Wilfrid Car » 05 Mai 2015, 08:15

Je suis en train de m'embrouiller: effectivement mais remarques semblent infondées.
Existent -il une fonction qui permet de vérifier quelles années renvoient à des NA?

Bien cordialement

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Messagepar matthieu faron » 05 Mai 2015, 08:53

Bonjour,

Vous pouvez utiliser la fonction is.na()

Code : Tout sélectionner

is.na(tapply(data$valeurs, data$années,sum))
Matthieu FARON

Wilfrid Car
Messages : 59
Enregistré le : 09 Avr 2015, 13:35

Messagepar Wilfrid Car » 05 Mai 2015, 09:16

Bonjour,
merci pour votre aide qui me permet d'avancer.
une remarque: dès que l'on a une lacune portant sur une année le logiciel renvoie un TRUE
années valeurs
1515 4556
1515 344
1515 NA

1515: TRUE

Cela me permet effectivement de mettre en évidence les années incomplètes.

Comment distinguer les années qui possède aucune valeur associée ?


Bien cordialement

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Messagepar matthieu faron » 05 Mai 2015, 09:24

Combinaisons des 2 réponses précédentes :

Code : Tout sélectionner

tapply(data$valeurs, data$années, function (x) all(is.na(x)))
Matthieu FARON

Wilfrid Car
Messages : 59
Enregistré le : 09 Avr 2015, 13:35

Messagepar Wilfrid Car » 05 Mai 2015, 09:38

Merci de votre disponibilité
Cela fonctionne parfaitement, mais j’avoue être dépasse par l'argument

Code : Tout sélectionner

function (x) all(is.na(x)


Pensez vous qu'il est possible d’afficher dans une couleur différente les années lacunaires dans mon barplot?

lacune: présence d'un NA pour une année
ou mieux: définir le seuil d'année lacunaire: % de Na par rapport à x valeurs

Bien cordialement

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Messagepar matthieu faron » 05 Mai 2015, 10:06

Le function (x) all(is.na(x))
s'appelle une fonction anonyme (je ne lui donne pas de nom mais je la définie). Pour chaque groupe elle regarde si il existe des données manquantes is.na() ce qui renvoie TRUE ou FALSE pour chaque valeur puis regarde si tous les arguments sont TRUE : all().
Ci dessous avec any() au moins un est vrai


Oui pas trop de problèmes :
En repartant de l'exemple de Nicolas et en faisant en 2 étapes

Code : Tout sélectionner

a <- tapply(c(1:9,NA),gl(2,5),sum,na.rm=TRUE)

## au moins 1 NA
b <- tapply(c(1:9,NA),gl(2,5),function(x) any(is.na(x)))


##un pourcentage (ici 20%)
d  <- tapply(c(1:9,NA),gl(2,5),function(x) (sum(is.na(x)) / length(x)) > 0.2 )

barplot(a, col = ifelse(b, "blue", "green"))
barplot(a, col = ifelse(d, "blue", "green"))
Matthieu FARON

Wilfrid Car
Messages : 59
Enregistré le : 09 Avr 2015, 13:35

Messagepar Wilfrid Car » 05 Mai 2015, 11:39

Cela fonctionne parfaitement: je deduis que col=ifelse permet de rajouter un objet supplémentaire (mais pourquoi ifelse?)


concernant les objet b et d est-il possible de lister les années comportant les critères ? (au moins 1 Na et au moins 20% de NA)
plutôt que d’obtenir les retours logiques?

Wilfrid

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Messagepar matthieu faron » 05 Mai 2015, 12:17

Mais les retours logiques peuvent servir à lister les années :

Code : Tout sélectionner

data$années[b]


Sinon pour le ifelse il permet de tester une condition sur tous les éléments d'un vecteurs et de renvoyer une valeur si vrai ou une autre si fausse.

Je vous recommande de prendre l'habitude quand vous vous posez une question de vous familiariser avec l'aide de R (qui est très bien faites même si au début ça parait un peu ésotérique) pour savoir ce que fait la fonction et comment l'utiliser (et voire des exemples).

Pour appeler l'aide :

Code : Tout sélectionner

?ifelse
Matthieu FARON

Wilfrid Car
Messages : 59
Enregistré le : 09 Avr 2015, 13:35

Messagepar Wilfrid Car » 05 Mai 2015, 12:37

Merci pour le conseil et encore tous mes remerciements pour votre aide.


Retourner vers « Questions en cours »

Qui est en ligne

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