insertion années vides dans un tableau de distribution

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

insertion années vides dans un tableau de distribution

Messagepar Wilfrid Car » 14 Avr 2015, 10:30

bonjour,

Débutant avec R, je ne sais comment procéder dans ce problème de manipulation de données:

J'observe un phénomène (expéditions maritimes) entre les années 1514 et 1866;
J'ai un relevé d'observations à partir duquel j'ai réalisé un tri à plat à l'aide de la fonction table:
exped_années<-table(data$yearam)

Par exemple, mon data.frame comprend 58 lignes ayant pour modalité "1848" (variable yearam) soit 58 expéditions;

J’aimerai identifier les années sans expéditions mais je ne sais pas trop comment procéder.

Peut on / faut-il fusionner à l'aide de la fonction merge un second data.frame (comprenant une série d'années complète) au premier afin d'obtenir des NA?

Merci d'avance...

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

Messagepar Logez Maxime » 14 Avr 2015, 11:29

Bonjour,

si tu souhaites toujours utiliser la fonction table tu peux rajouter des modalités à ton facteur avant de faire le table ainsi toutes les années seront "comptées" par la fonction table et celles qui n'apparaissent jamais dans ton tableau seront à 0 :

Code : Tout sélectionner

x <- 1900:1901
x <- factor(x, levels=1900:1905)

table(x)
x
1900 1901 1902 1903 1904 1905
   1    1    0    0    0    0
Cordialement,
Maxime

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

Messagepar Wilfrid Car » 14 Avr 2015, 15:38

Cela marche parfaitement, grâce aux levels.
J'en profite pour poursuivre...
Comment identifier les années ayant un 0?
J'aimerai créer un tableau présentant les périodes d'interruption du trafic (0)
ex:
1515-1519: 0 expéditions
1638-1589: 0 expéditions


Bien cordialement,

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

Messagepar Logez Maxime » 15 Avr 2015, 06:30

re,

une proposition :

Code : Tout sélectionner

x <- c(1900,1901,1904)
x <- factor(x, levels=1900:1910)

auxi <- levels(x)[table(x)==0]
auxi <- as.numeric(auxi)

f <- function(x) sprintf("%s-%s : 0 expédition",min(x), max(x))

res <- tapply(auxi, cumsum(c(0,diff(auxi)-1)), f)
res
                         0                          1
"1902-1903 : 0 expédition" "1905-1910 : 0 expédition"

cat(res, sep="\n")
1902-1903 : 0 expédition
1905-1910 : 0 expédition
Cordialement,
Maxime

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

Messagepar Wilfrid Car » 15 Avr 2015, 08:29

Cela fonctionne parfaitement mais cela me dépasse...ce qui ne va pas sans mes poser problème.
De mon côté j'avais transformé mon facteur en data.frame puis j'avais crée une sous-population à l'aide de la fonction subset....mais le code que vous proposez n'est pas de mon niveau!


Code : Tout sélectionner

distribexpeddnul<- factor(data$yearam, levels=1514:1866)
distribexped2<-table(distribexpeddnul) # création d'un tableau de distribution
distribexped3<-as.data.frame (distribexped2) # conversion en data.frame
interrup<-subset (distribexped3,Freq=="0" ) # création d'une sous population


Wilfrid

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

Messagepar Logez Maxime » 15 Avr 2015, 08:39

re,

Ce n'est pas une question de niveau. Ce qui compte c'est qu'au final tu obtiennes ce que tu souhaites quelque soit le code utilisé. Après j'ai beaucoup appris en regardant les solutions proposées à des questions qui ne m'intéressaient pas forcément.

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

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