[英]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.