Question

J'ai un fichier .csv avec quatre colonnes (nom, identifiant, année, valeur, voir exemple ci-dessous) et veuillez faire quelques parcelles de série de temps à l'aide de la parcelle ("année", type= 'B'). Comme certaines données entre les années de la série chronologique sont manquantes, je voudrais écrire de nouvelles colonnes contenant des valeurs NA entre les années, de sorte que je puisse tracer les données sans avoir connecté des lignes dans l'écart de l'année (dans mon exemple: remplir les valeurs NA pourles années 1984 à 1987 dans le point de Bartley).

Y a-t-il un moyen de faire cela ??Toute aide est aimablement appréciée!Merci!

Mon fichier .csv ressemble à ceci:

NAME;                ID;      YEAR; VALUE
NAME1;              885;    1988;      -2
NAME1;              885;    1989;       0
NAME2;  2665;   1999;       4
NAME2;  2665;   2000;       8
NAME2;  2665;   2001;      19
NAME2;  2665;   2002;      13
NAME2;  2665;   2003;      13
NAME3;          893 ;   1983;       0
NAME3;          893 ;   1988;       2
NAME3;          893 ;   1989;      -1
NAME4;              877 ;   1972;      -1
NAME5;          894 ;   1973;      -3

Était-ce utile?

La solution

Heureux d'entendre que vous l'avez compris.Je m'interroge toujours sur le nombre de parcelles par page.J'ai ajouté quelques lignes au code pour vous permettre de définir le nombre de lignes et de colonnes de parcelles pour apparaître sur une page, puis de boucler autant de pages de parcelles que nécessaire.J'ai également ajouté un peu de choses ggplot pour changer l'apparition du texte de la parcelle.

    # read data file into xx and change character years to Date values
    xx <- read.csv("plot_test.txt",header=TRUE,sep=";")
    xx$YEAR <- as.Date(paste(as.character(xx$YEAR),"-01-01",sep=""))
    xx$NAME_YR <- paste(xx$NAME,xx$YEAR,sep="")

    #  create Year template for years between min and max years for each NAME
    xxmin <- as.Date(tapply(xx$YEAR, xx$NAME, min ), origin="1970-01-01")
    xxmax <- as.Date(tapply(xx$YEAR, xx$NAME, max ), origin="1970-01-01")
    xxdates <- mapply(seq, xxmin, xxmax, by="12 month")
    xxyears <- data.frame(NAME=rep(names(xxdates), sapply(xxdates, length)), 
                          YEAR=as.Date(unlist (xxdates),origin="1970-01-01"))
    xxyears$NAME_YR <- paste(xxyears$NAME,xxyears$YEAR,sep="")

    #  merge  template and data and assign colnames to ploting data
    xy <- merge(xx, xxyears, by="NAME_YR", all=TRUE)[,c("NAME.y","ID","YEAR.y","VALUE")]
    names(xy) <- c("NAME","ID","YEAR","VALUE")

   # plot each NAME in a separate chart with own time axis
   library(ggplot2)
   rows_pg <- 2   # number of rows of plots per page
   cols_pg <- 2   # number of columns of plots per page
   chts_pg <- rows_pg*cols_pg
   num_plots <- nlevels(xy$NAME)
   #  set plot axis labels and main titles and set values for text
   spttl <- ggtitle("Your plot title\nSecond line of your plot title")
   spaxlb <- labs ( x="Year", y="Data Values")  
   spth <-  theme(plot.title=element_text(size=16, face="bold", colour="blue") )
   spth <-  spth + theme(axis.title.x= element_text(size=14, colour="blue") )
   spth <-  spth + theme(axis.title.y = element_text(size=14, colour="blue") )
   spth <-  spth + theme(axis.text = element_text(size=14, colour="black") )
   spth <-  spth + theme(strip.text = element_text(size=14, colour="brown"))
   #  generate plots
   for( iplt in seq(1,num_plots, chts_pg) )  {
     sp <- ggplot(data=xy[xy$NAME %in% levels(xy$NAME)[iplt:(iplt+chts_pg-1)], ],
                  aes(x=YEAR, y=VALUE)) + geom_line() + geom_point()
     sp  <- sp + facet_wrap(~ NAME, scales="free_x", nrow=rows_pg, ncol=cols_pg)
     plot(sp + spttl + spaxlb + spth)
   }

Autres conseils

Vous pouvez lire le fichier comme vous l'avez montré à l'aide de SEP=";"En lecture.csv pour identifier des valeurs distinctes. Vous pouvez envisager quelque chose comme le code ci-dessous pour lire les données, fixer les dates, ajouter les NAS et faire les parcelles.Je mettez vos données dans un fichier appelé "Plot_Test.txt" alors read.csv obtient les données de là.Aussi de votre commentaire sur l'article Bartley, je suppose que vous souhaitez séparer les lignes de chaque article de votre parcelle.

# read data file into xx and change character years to Date values
xx <- read.csv("plot_test.txt",header=TRUE,sep=";")
xx$YEAR <- as.Date(paste(as.character(xx$YEAR),"-01-01",sep=""))

#    create df as a template for all years and names
date_seq <- seq(min(xx$YEAR),max(xx$YEAR),by="12 month")
df <- merge(data.frame(NAME=unique(xx$NAME),ID=unique(xx$ID)),data.frame(YEAR=date_seq,VALUE=NA),all=TRUE)

# create unique names in xx and df to merge on
xx$NAME_YR <- paste(xx$NAME,xx$YEAR,sep="")
df$NAME_YR <- paste(df$NAME,df$YEAR,sep="")
#  merge keeping only real data columns and restore original column names
xy <- merge(xx, df,by="NAME_YR",all=TRUE)[,c("NAME.y","ID.y","YEAR.y","VALUE.x")]
names(xy) <- names(xx)[1:4]

# plot xy using ggplot
library(ggplot2)
sp <- ggplot(data=xy, aes(x=YEAR, y=VALUE, colour=NAME)) + geom_point() + geom_line()
plot(sp)  

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top