R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

CSV-sormenjälki, R-versio

Luin tänään uudesta, ihan näppärän oloisesta palvelusta, CSV Fingerprints. SIinä on ajatuksena tarkistaa tekstitiedoston (datamatriisi) sisältö siltä varalta, että siinä on esimerkiksi puuttuvia arvoja, tyhjiä soluja tai samoissa sarakkeissa sekaisin eri tietomuotoja. Ensimmäisenä tuli myös mieleeni, että sitä voisi käyttää taulukon muutosten jäljittämiseen esimerkiksi datan puhdistamisen aikana. Muistan nähneeni vastaavankaltaisen sovelluksen, mahdollisesti raster-paketilla toteutettuna, mutta eihän enää mistään löytynyt. Piti siis tehdä itse.

R:llä toteutettu funktio toimii data framella:

csvSormenjalki<-function(x, cols=NULL) {
 
   if(is.null(cols)) {
      cols<-c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "#999999")
   }
 
   m<-matrix(ncol=ncol(x), nrow=nrow(x), data=1)
   cl<-as.character(unlist(lapply(x,class)))
 
   par(mar=c(2,2,5,1))
   image(t(m[nrow(m):1,]), col=1, axes=F)
 
   for(i in 1:ncol(m)) {
      m<-matrix(ncol=ncol(x), nrow=nrow(x), data=NaN)
      if(cl[i] %in% c("factor")) {
         m[,i]<-1
         image(t(m[nrow(m):1,]), add=TRUE, col=cols[2])
      }
      if(cl[i] %in% c("integer", "numeric")) {
         m[,i]<-1
         image(t(m[nrow(m):1,]), add=TRUE, col=cols[3])
      }
      if(cl[i] %in% c("logical")) {
         m[,i]<-1
         image(t(m[nrow(m):1,]), add=TRUE, col=cols[4])
      }
      if(cl[i] %in% c("Date", "POSIXct", "POSIXlt")) {
         m[,i]<-1
         image(t(m[nrow(m):1,]), add=TRUE, col=cols[6])
      }
   }
   m<-matrix(ncol=ncol(x), nrow=nrow(x), data=NaN)
   m[is.na(x)]<-1
   image(t(m[nrow(m):1,]), add=TRUE, col=cols[1])
 
   m<-matrix(ncol=ncol(x), nrow=nrow(x), data=NaN)
   m[x==""]<-1
   image(t(m[nrow(m):1,]), add=TRUE, col="white")
 
   axis(3, labels=colnames(x[nrow(x):1,]), at=seq(from = 0, to = 1, length = ncol(x)), tck = 0, lwd = 0, las = 2, cex.axis=0.5)
   rn<-rownames(x[nrow(x):1,])
   rnat<-seq(from = 0, to = 1, length = nrow(x))
   rl<-seq(0, nrow(x), ceiling(nrow(x)/10))
 
   # axis(2, labels=rownames(x[nrow(x):1,]), at=seq(from = 0, to = 1, length = nrow(x)), tck = 0, lwd = 0, las = 2, cex.axis=0.5)
   axis(2, labels=rn[rl], at=rnat[rl], las = 2, cex.axis=0.5)
   box(bty="l", col="white")
 
   legend(x=0, y=-0.02, legend=c("character", "factor", "number", "logical", "Date", "NA", "empty"), fill=c("black", cols[c(2,3,4,6,1)], "white"), xpd=NA, ncol=7, border=c("black", cols[c(2,3,4,6,1)], "black"), cex=0.65, bty="n")
 
   return(cl)
 
}

Funktiota voidaan kutsua yksinkertaisesti esimerkiksi CSV Fingerprint:in GitHub-repositorystä löytyville CSV-tiedostoille (example1.csv ja example2.csv), jotka on ensin luettu R:ään data frameiksi d1 ja d2:

csvSormenjalki(d1)
csvSormenjalki(d2)

Tuloksena ovat seuraavanlaiset kuva:

Funktio tuntuisi siis toimivan pienille taulukoille mainiosti, mutta suurille taulukoille se ei välttämättä sovi, sillä funktio täyttää muistiavaruutta melko liberaalisti…


Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *