2012-12-27 16 views
5

ディレクトリ内の重複したファイルを識別する次のRコードを書きました。 plyrパッケージ(または同様のもの)を使ってforループをどのようにベクトル化できますか?私は、私が思いついたよりももっと慣用的なRソリューションを実現したいと思います。 (小テストディレクトリ使用)このRコードをベクトル化する方法Plyr、Apply、または同様の方法を使用しますか?

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 

出力である:

h=ldply(filelist, digest, file=TRUE, algo="md5") 
h$filenames=filelist 

が、(MD5のすべてのキーと値のペアの一意の行になってしまった:

> 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"  

私が試み、 ファイル名)。コンパクトな出力を得ることができませんでした。

(背景:Raymond Hettinger氏がPyCon AU 2011の基調講演「何がPythonを素晴らしいものにするのか」で発表されたPythonコードを変換しました。スライドはhttp://slidesha.re/WKkh9Mです.LOCを半分にカットできました。しかし、私はベクトル化することでもっとうまくやることができると思っています。

+2

か '分割(H、H $ダイジェスト)'を使って 'ldply'コマンドに従ってください? –

+1

ArunとBen - 私の目標は、キーがmd5ハッシュであるリストを持つことです。値はそれぞれのユニークキーに対応するファイル名のリストです(サンプル出力を参照)。結果は重複したmd5キーと関連するファイル名であり、ldply(seq_along(filelist)、関数(idx)c(digest(filelist [idx]、file = TRUE、algo = "md5")、filelist [idx]値。私は溶け合いにつまずくと無駄にキャストしようとしました。 – goplayer

答えて

6

はもう少し簡潔であるベースでのソリューションです:

md5s<-sapply(filelist,digest,file=TRUE,algo="md5") 
split(filelist,md5s) 
+0

簡潔な解決に感謝します。 – goplayer

4

ここに1つの答えがあります。まず、md5とファイル名をldplyのdata.frameに取得します。次に、希望するリストをdlplyで作成します。ここで

fl <- ldply(seq_along(filelist), function(idx) 
      c(digest(filelist[idx], file=TRUE, algo="md5"), 
      filelist[idx])) 
fl <- dlply(fl, .(V1), function(x) x$V2) 
+0

ありがとうございます。それは理にかなっている。 – goplayer

関連する問題