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,
è stato richiesto agli impiegati dell’azienda di ristrutturarla e di ottenere una lista come questa (perchè?™).
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.




6 Commenti
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 :-)
@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
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
@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
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….
@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.