Ecco un piccolo esempio dei rapporti che si possono fare in R.
Questo documento ha due parti:
- Una piccola sula manipolazione degli dati
- E altra con gli idee per il report.
In questo caso, ho messo l’informazione de due files de dati per i rilievi fati in Aprile e Maggio nel stesso campo.
Questa parcella a 170 plots, per cui e un bello test di difficoltà (da solito sono meno).
Il codice e dovunque ma occulto, si poi vedere cliccando il bottone a sinistra. Si non sei interessato nel codice poi saltare diretammente a la parte che si chiama Il Report
Vado usare un csv che ho fatto con i datti de aprile e maggio, ma simulando il formato che vi propongo, dove tutti i traits sono nel stesso file.
library(ggplot2)
library(dplyr)
library(plyr)
library(tidyr)
library(plotly)
library(reshape2)
library(knitr)
library(forcats)
library(DT)
setwd("C:/Users/Usuario1/Dropbox/RSR/Fieldbook & Database/R Reports")
mydata <- read.csv("mydata.csv", check.names = F, na.strings=c("","NA"))
Adesso che la data e in questo formato, il quale aspettiamo avere sul Field Book e sul database, si trasforma la data in una cosa più facile de usare.
Questo si fa facendo un “melt” della data, dove abbiamo solo lo collone indicative della parcella ( Plot Id, RSR Code, etc), una colonna per indicare la variabile e un altra per indicare il valore.
n = length(mydata) #Quantità totale de variabili
mydatamelt<- melt(mydata,
id.vars= c(1:5), #In questo caso ho 5 variabile d'identificazione
measure.vars= c(6:n), # Tutti quelli dopo sono "traits".
na.rm = F) #Guardo i missing data per vedere dove sono.
Poi, separo, la colonna delle variabile in due. Una sara il momento de la valutazione e l’altra sara propriamente la variabile.
data <- separate(mydatamelt,
variable,
into = c("temp", "var"),
sep = " - ")
data$temp <- revalue(data$temp, c("Acc" = "Accestamento",
"Lev"= "Levata",
"Spi"= "Spigatura",
"Fio"= "Fioritura",
"Rac"= "Raccolta",
"PostR"= "PostRaccolta"))
data$temp <- fct_relevel(data$temp, c("Accestamento","Levata","Spigatura",
"Fioritura","Raccolta", "PostRaccolta"))
Finiamo con una struttura de dati cosi, il numero dentro della tabella sono i potenziali osservazioni (170 e il numero di plots).
#Creare la tavola
df <- table(data$var, data$temp)
#Ordinare gli elementi
df <- df[,c("Accestamento","Levata","Spigatura",
"Fioritura","Raccolta", "PostRaccolta")]
kable(df)
Accestamento | Levata | Spigatura | Fioritura | Raccolta | PostRaccolta | |
---|---|---|---|---|---|---|
Allettamento | 0 | 0 | 170 | 170 | 170 | 0 |
Allettamento.Causa | 0 | 0 | 170 | 170 | 170 | 0 |
Campione di piante | 0 | 0 | 0 | 0 | 0 | 170 |
Campione di spighe | 0 | 0 | 0 | 0 | 0 | 170 |
Colore.Altro | 0 | 170 | 170 | 0 | 0 | 0 |
Colore.Piante | 170 | 170 | 170 | 170 | 0 | 0 |
Copertura.Parcella | 170 | 170 | 170 | 170 | 0 | 0 |
Danni | 170 | 170 | 170 | 170 | 170 | 0 |
Danni.Foto | 170 | 170 | 170 | 170 | 170 | 0 |
Infestanti.Numero | 170 | 170 | 170 | 170 | 0 | 0 |
Infestanti.Tipo | 170 | 170 | 170 | 170 | 0 | 0 |
location.GPS | 170 | 170 | 170 | 170 | 0 | 0 |
Malattie | 0 | 0 | 170 | 170 | 170 | 0 |
Malattie.Foto | 0 | 0 | 170 | 170 | 170 | 0 |
Malattie.Notes | 0 | 0 | 170 | 170 | 170 | 0 |
Maturita Spighe | 0 | 0 | 0 | 170 | 0 | 0 |
Modalita di Rac | 0 | 0 | 0 | 0 | 0 | 170 |
Nome.Campionatore | 170 | 170 | 170 | 170 | 0 | 0 |
Nuovo store code | 0 | 0 | 0 | 0 | 0 | 170 |
Osservazioni | 170 | 170 | 170 | 170 | 170 | 170 |
Osservazioni.Foto | 170 | 170 | 170 | 170 | 170 | 170 |
P1_Alt 1 rachide | 0 | 0 | 0 | 170 | 0 | 0 |
P1_Alt 2 spiga | 0 | 0 | 0 | 170 | 0 | 0 |
P1_Alt 3 reste | 0 | 0 | 0 | 170 | 0 | 0 |
P10_Alt 1 rachide | 0 | 0 | 0 | 170 | 0 | 0 |
P10_Alt 2 spiga | 0 | 0 | 0 | 170 | 0 | 0 |
P10_Alt 3 reste | 0 | 0 | 0 | 170 | 0 | 0 |
P2_Alt 1 rachide | 0 | 0 | 0 | 170 | 0 | 0 |
P2_Alt 2 spiga | 0 | 0 | 0 | 170 | 0 | 0 |
P2_Alt 3 reste | 0 | 0 | 0 | 170 | 0 | 0 |
P3_Alt 1 rachide | 0 | 0 | 0 | 170 | 0 | 0 |
P3_Alt 2 spiga | 0 | 0 | 0 | 170 | 0 | 0 |
P3_Alt 3 reste | 0 | 0 | 0 | 170 | 0 | 0 |
P4_Alt 1 rachide | 0 | 0 | 0 | 170 | 0 | 0 |
P4_Alt 2 spiga | 0 | 0 | 0 | 170 | 0 | 0 |
P4_Alt 3 reste | 0 | 0 | 0 | 170 | 0 | 0 |
P5_Alt 1 rachide | 0 | 0 | 0 | 170 | 0 | 0 |
P5_Alt 2 spiga | 0 | 0 | 0 | 170 | 0 | 0 |
P5_Alt 3 reste | 0 | 0 | 0 | 170 | 0 | 0 |
P6_Alt 1 rachide | 0 | 0 | 0 | 170 | 0 | 0 |
P6_Alt 2 spiga | 0 | 0 | 0 | 170 | 0 | 0 |
P6_Alt 3 reste | 0 | 0 | 0 | 170 | 0 | 0 |
P7_Alt 1 rachide | 0 | 0 | 0 | 170 | 0 | 0 |
P7_Alt 2 spiga | 0 | 0 | 0 | 170 | 0 | 0 |
P7_Alt 3 reste | 0 | 0 | 0 | 170 | 0 | 0 |
P8_Alt 1 rachide | 0 | 0 | 0 | 170 | 0 | 0 |
P8_Alt 2 spiga | 0 | 0 | 0 | 170 | 0 | 0 |
P8_Alt 3 reste | 0 | 0 | 0 | 170 | 0 | 0 |
P9_Alt 1 rachide | 0 | 0 | 0 | 170 | 0 | 0 |
P9_Alt 2 spiga | 0 | 0 | 0 | 170 | 0 | 0 |
P9_Alt 3 reste | 0 | 0 | 0 | 170 | 0 | 0 |
Parcella | 170 | 170 | 170 | 170 | 170 | 0 |
Parcella.Foto | 0 | 170 | 170 | 170 | 0 | 0 |
Parcella.Numero.Piante | 170 | 170 | 170 | 170 | 170 | 0 |
Presenza di cere | 0 | 0 | 0 | 170 | 0 | 0 |
Presenza reste | 0 | 0 | 0 | 170 | 0 | 0 |
Quantita Rac | 0 | 0 | 0 | 0 | 0 | 170 |
RGV/FAO | 0 | 0 | 0 | 170 | 0 | 0 |
RGV/FAO.Foto | 0 | 0 | 0 | 170 | 0 | 0 |
Ecco come si potrebbe vedere il report fato automaticamente con R con i dati caricati.
La mia idea e che questi report si possono fare automaticamente una volta caricati i dati. Lo potresti vedere da subito in campo nel telefono oppure nel Tablet o computer.
Possiamo pensare che questo report ha stato generato giusto dopo il secondo rilievo (maggio) o solo ci mostra i dati de aprile e maggio ( anche ci sono tutti gli altri collone ma vuote)
Prima cosa, serve vedere quanti dati mancanti ci sono.
Si fa un tabellone con la summa de dati mancanti. che sia interattiva e ti lasci vedere cosa manca.
Ci sono variabile dove e normale avere dati mancanti (come gli osservazioni) ma in altre non va bene (Come la presenzia/assenza de la parcella)
In questo caso, si hai appena fato il rilievo in spigatura, poi filtrare nella collona Rilievo con solo quelle da “Spigatura”. Si puo vedere che ci mancano alcuni dati, especialmente importanti quelli de “Parcella”.
mytable <- aggregate(value ~ var*temp,
data=data,
function(x) {sum(is.na(x))}, na.action = NULL)
#Order properly
mytable <- mytable[order(mytable$value, mytable$temp),]
#Change names
colnames(mytable) <- c("Variabile","Rilievo","Dati Mancanti")
datatable(mytable,
caption= "Variabili con dati mancanti",
filter = 'top', options = list(pageLenght= 20,
autoWidth = TRUE))
La variabile parcella e da solito la prima che si fa in campo, e ci dice se ci sono le piante oppure no. Se ci sono missing data per questa variabile siamo nei guai.
data2plot_parcella <- subset(data, data$var == "Parcella")
kable(table(data2plot_parcella$value, data2plot_parcella$temp, useNA="ifany"), caption= "Presenzia delle Parcelle nei Rilievi")
Accestamento | Levata | Spigatura | Fioritura | Raccolta | PostRaccolta | |
---|---|---|---|---|---|---|
1_Tutta | 0 | 59 | 59 | 0 | 0 | 0 |
2_Metà | 0 | 24 | 25 | 0 | 0 | 0 |
3_Piante | 0 | 45 | 39 | 0 | 0 | 0 |
4_Assente | 0 | 40 | 44 | 0 | 0 | 0 |
NA | 170 | 2 | 3 | 170 | 170 | 0 |
Si vede che in questo rilevo sono 44 parcelle che non ci sono, e 3 dove non c’e neanche il dato. Posso capire meglio quale sono con un grafico cosi. Poi andare su e vedere i valori, anche cliccare nella leggenda per selezionare i valori NA (mancanti).
parcella <- ggplot(data2plot_parcella,
aes(y= plot_id, x= temp, fill= value))+
geom_tile()+
labs(y= "Plot ID",x= "Momento di Rilievo",
fill= "Presenza Parcella", main= "Presenzia delle parcelle nei disticti relievi")
ggplotly(parcella)
Per i variabili numerici, como il numero de infestanti, sarebbe utile una visualizzazione che ci permetta vedere si c’è un dato tropo alto o troppo basso. In questo caso (Numero de Infestanti) non essiste troppo basso, ma con la altezza si potrebbe vedere.
data2plot_infestanti<- subset(data, data$var == "Infestanti.Numero")
data2plot_infestanti$value <- as.numeric(data2plot_infestanti$value)
data2plot_infestanti$temp <- as.factor(data2plot_infestanti$temp)
infestanti<- ggplot(data2plot_infestanti,
aes(y= value, x=temp, color=plot_id))+
geom_point()+
labs(y= "Numero de Infestanti / m²",x= "Momento di Rilievo",
color = "Plot ID")
ggplotly(infestanti)
Questo e tutto per addesso, se vi piace e vi serve andiamo oltre.