L’elefante e la farfalla – interpretata da Excel e R…

105 2010

Prendendo spunto da questo post di Gaspar in cui presenta una macro da lui programmata in Excel per risolvere un problema di ordinamento di alcuni ordini di un’azienda, sono rimasto sconcertato dal numero spropositato di comandi necessario per effettuare un’operazione così “semplice”.

Partendo da una tabella di ordini come questa,

ordinitab Lelefante e la farfalla   interpretata da Excel e R...

è stato richiesto agli impiegati dell’azienda di ristrutturarla e di ottenere una lista come questa (perchè?).

ordini2 Lelefante e la farfalla   interpretata da Excel e R...

Ho pensato a come si potesse fare in R nel minor numero di righe di codice possibile, e dopo una decina di minuti di prove questo è il risultato:

library(reshape)
ordini <- read.csv("ordini.csv")
ordini2 <- melt(ordini, id="Prodotto")
names(ordini2) <- c("Prodotti","Taglia","Quantità")
ordini3 <- ordini2[order(ordini2$Prodotti), ]

Lungi dal voler appiccare un flame sul confronto Excel vs R, i cui campi di applicazione e il target d’utenza non sempre sono i medesimi per la natura stessa di questi software, sono convinto che R potrebbe essere in diverse situazioni molto più utile di Excel anche in ambito aziendale.
E paradossalmente anche più semplice da utilizzare, dopo averne scalato un po’ la (più ripida) curva d’apprendimento.

Nota: le immagini le ho realizzate utilizzando il pratico package “xtable”, che ha convertito l’output del codice di R in un documento in LaTeX, riconvertito poi da me in pdf.
Il tutto con sole 3 linee in più di codice.


Questo articolo è stato pubblicato in Senza categoria Etichette: , ,

Scrivi un commento o lascia un trackback: Trackback URL

6 Commenti

  1. Pubblicato 01/05/2010 alle 11:12 | Link Permanente

    Marco, il tuo codice in R è elegantissimo! Complimenti. Ma tieni presente che io non sono un programmatore e che sicuramente un esperto di VB farebbe molto meglio di me :-)

    • Marco
      Pubblicato 01/05/2010 alle 11:32 | Link Permanente

      @Gaspar: di certo qualche guru di R potrebbe limare ancora qualcosa :-)
      E da non programmatore quale io sono, sono sempre affascinato dalle soluzioni “quick&dirt” come la tua (che presuppone lo stesso una certa conoscenza della materia).
      Facile arrivarci quando qualcuno ti ha già insegnato tutto :-P

  2. Pubblicato 03/05/2010 alle 14:53 | Link Permanente

    per un attimo – ma proprio un attimo – mi hai quasi convinto a passare a R. poi pero’ ci ho pensato un attimo ed ecco qua:

    data = load (‘info.dat’);
    data_new = reshape (data’,size(data,1)*size(data,2),1);

    matlab rulez… :D :D

  3. Marco
    Pubblicato 03/05/2010 alle 15:11 | Link Permanente

    @Robsom: maledetto!
    Comunque ti manca una riga che dia i nomi giusti alle colonne (“Prodotti”, …), che non ci sono nel file di input!
    Unendo più comandi insieme arrivo a 3 righe totali, inclusa quella per caricare il package aggiuntivo “reshape”.
    Quindi mi sa che pareggiamo 3 a 3 :-P

  4. Pubblicato 04/05/2010 alle 12:09 | Link Permanente

    a dire il vero non credo si possano “nominare” le colonne. se il file di input contiene i nomi si puo’ leggere il file e fargli mettere i nomi delle colonne in un vettore di stringhe, senza istruzioni addizionali. ma perche’ vuoi dare dei nomi alle colonne se poi tanto va messo tutto incolonnato?

    per inciso, sono d’accordo con voi e non riesco a capire perche’ uno vorrebbe fare sta cosa a una comodissima tabella, ma va beh….

    • Marco
      Pubblicato 08/05/2010 alle 10:39 | Link Permanente

      @robsom: i nomi alle colonne li ho messi per replicare esattamente l’esempio di Gaspar. Non c’erano nel file di input, per questo li ho aggiunti dopo.

Scrivi un Commento

Il tuo indirizzo Email non verra' mai pubblicato e/o condiviso. I campi obbligatori sono contrassegnati con *

*
*

Puoi usare questi HTML tag e attributi: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting