5

ディレクトリ内の重複ファイルを識別する次の R コードを作成しました。plyr パッケージ (または類似のもの) を使用して for ループをベクトル化するにはどうすればよいですか? 私が思いついたものよりも慣用的な R ソリューションを実現したいと考えています。

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

出力は次のとおりです(小さなテストディレクトリを使用):

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

私は試した:

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

(MD5、ファイル名)のすべてのキーと値のペアに対して一意の行になりました。必要なコンパクトな出力を得ることができませんでした。

(背景: 演習として、Raymond Hettinger が PyCon AU 2011 の基調講演「What Makes Python Awesome」で提示した Python コードを変換しました。スライドはここにあります: http://slidesha.re/WKkh9M。 LOC は半分ですが、ベクトル化することで、より良く、より多くのことを学ぶことができると思います)。

4

2 に答える 2

6

これがもう少し簡潔なベースのソリューションです:

md5s<-sapply(filelist,digest,file=TRUE,algo="md5")
split(filelist,md5s)
于 2012-12-27T20:55:45.413 に答える
4

これが1つの答えです。まず、md5 とファイル名を data.frame に取得しldplyます。次に、 で目的のリストを作成します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)
于 2012-12-27T20:37:46.183 に答える