Załóżmy, że plik CSV zawiera liczbę opublikowanych twitów (dane tygodniowe). Problem: przedstawić szereg w postaci przebiegu czasowego (time plot). Taki skrypt R wymyśliłem do zrealizowania tego zadania:
require(ggplot2) args <- commandArgs(TRUE) ttname <- args[1]; file <- paste(ttname, ".csv", sep="") filePDF <- paste(ttname, ".pdf", sep="") d <- read.csv(file, sep = ';', header=T, na.string="NA", ); ## Plik CSV jest postaci: ##str(d) ## wiersze 1,2 + ostatni są nietypowe (usuwamy) rows2remove <- c(1, 2, nrow(d)); d <- d[ -rows2remove, ]; ## szacujemy prosty model trendu lm <- lm(data=d, posts ~ no ); summary(lm) posts.stats <- fivenum(d$posts); posts.mean <- mean(d$posts); sumCs <- summary(d$posts); otherc <- coef(lm); # W tytule średnia/mediana i równanie trendu title <- sprintf ("Weekly for %s # me/av = %.1f/%.1f (y = %.2f x + %.1f)", ttname, sumCs["Median"], sumCs["Mean"], otherc[2], otherc[1] ); ##str(d$no) ## Oś x-ów jest czasowa ## Skróć yyyy-mm-dd do yy/mmdd d$date <- sub("-", "/", d$date) ## zmienia tylko pierwszy rr-mm-dd d$date <- sub("-", "", d$date) ## usuwa mm-dd d$date <- gsub("^20", "", d$date) ## usuwa 20 z numeru roku 2018 -> 18 weeks <- length(d$no); ## https://stackoverflow.com/questions/5237557/extract-every-nth-element-of-a-vector ## Na skali pokaż do 20 element /dodaj ostatni `na pałę' (najwyżej zajdą na siebie) ## możnaby to zrobić bardziej inteligentnie ale nie mam czasu scaleBreaks <- d$no[c(seq(1, weeks, 20), weeks)]; scaleLabs <- d$date[c(seq(1, weeks, 20), weeks)]; ggplot(d, aes(x = no, y = posts)) + geom_line() + ggtitle(title) + ylab(label="#") + xlab(label=sprintf("time (yy/mmdd) n=%d", weeks )) + scale_x_continuous(breaks=scaleBreaks, labels=scaleLabs) + geom_smooth(method = "lm") ggsave(file=filePDF)
Niezwykle cenna jest ta wskazówka. Rewelacyjny wpis.
OdpowiedzUsuń