Ho scritto il seguente codice R che identifica i file duplicati in una directory. Come si può vettorizzare il ciclo for utilizzando il pacchetto plyr (o simile)? Mi piacerebbe ottenere una soluzione R più idiomatica di quella che ho inventato.Come vettorializzare questo codice R usando Plyr, Applica o Simile?
library("digest") # to compute the MD5 digest
test_dir = "/Users/user/Dropbox/kaggle/r_projects/test_photo"
filelist <- dir(test_dir, pattern = "JPG|AVI", recursive=TRUE,
all.files =TRUE, full.names=TRUE)
fl = list() #create and empty list to hold md5's and filenames
for (itm in filelist) {
file_digest = digest(itm, file=TRUE, algo="md5")
fl[[file_digest]]= c(fl[[file_digest]],itm)
}
fl
l'uscita è (usando una piccola directory test):
> fl
$`5715b719723c5111b3a38a6ff8b7ca56`
[1] "/Users/user/Dropbox/kaggle/r_projects/test_photo/folder_a/IMG_3480 copy.JPG"
[2] "/Users/user/Dropbox/kaggle/r_projects/test_photo/folder_a/IMG_3480.JPG"
$`24fd4d7d252ca66c8d7a88b539c55112`
[1] "/Users/user/Dropbox/kaggle/r_projects/test_photo/folder_a/IMG_3481 copy.JPG"
[2] "/Users/user/Dropbox/kaggle/r_projects/test_photo/folder_a/IMG_3481.JPG"
[3] "/Users/user/Dropbox/kaggle/r_projects/test_photo/folder_b/IMG_3481.JPG"
$`2a1d668c874dc856b9df0fbf3f2e81ec`
[1] "/Users/user/Dropbox/kaggle/r_projects/test_photo/folder_a/IMG_3482 copy.JPG"
[2] "/Users/user/Dropbox/kaggle/r_projects/test_photo/folder_a/IMG_3482.JPG"
[3] "/Users/user/Dropbox/kaggle/r_projects/test_photo/folder_b/IMG_3482 copy.JPG"
[4] "/Users/user/Dropbox/kaggle/r_projects/test_photo/folder_b/IMG_3482.JPG"
Ho provato:
h=ldply(filelist, digest, file=TRUE, algo="md5")
h$filenames=filelist
ma finito con una fila unica per ogni coppia di valori chiave (MD5 , nome del file). Non ero in grado di ottenere l'output compatto desiderato.
(Background: Come esercizio, ho convertito il codice Python presentato da Raymond Hettinger nel suo keynote PyCon AU 2011 "What Makes Python Awesome" .Le diapositive sono qui: http://slidesha.re/WKkh9M. Sono stato in grado di tagliare il LOC a metà, ma penso di poter fare meglio - e imparare di più - con il vettorializzare).
O seguire il vostro 'comando ldply' con' split (h, h $ digest) '? –
Arun e Ben - il mio obiettivo è avere una lista le cui chiavi sono gli hash md5 ei valori sono elenchi di nomi file corrispondenti a ciascuna chiave univoca (vedi output di esempio). Quando eseguo ldply (seq_along (filelist), function (idx) c (digest (filelist [idx], file = TRUE, algo = "md5"), filelist [idx])) i risultati sono duplicati md5 e il nome file associato valori. Ho provato a incespicare attraverso lo scioglimento e il cast senza successo. – goplayer