R Series TIME GAP remplissez pour traçue avec type= 'B'
-
02-01-2020 - |
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
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)