簡體   English   中英

如何使用Plyr,Apply或Similar來矢量化此R代碼?

[英]How to Vectorize this R code Using Plyr, Apply, or Similar?

我編寫了以下R代碼來識別目錄中的重復文件。 如何使用plyr包(或類似)對for-loop進行矢量化? 我想實現一個比我提出的更慣用的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主題演講“什么使Python真棒”中提供的python代碼。幻燈片在這里: http//slidesha.re/WKkh9M 。我能夠削減LOC減半,但我認為我可以通過矢量化做得更好 - 並了解更多信息。

這是一個更簡潔的基礎解決方案:

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

這是一個答案。 首先使用ldply將md5和文件名添加到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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM