首页 > 解决方案 > 用 between() 循环

问题描述

我整理照片,标记包含感兴趣动物的照片组的开始和结束图像。成品看起来像下面的内容。排序后,我通常会使用开始和结束照片作为标记,将感兴趣的照片从每个子文件夹移动到主文件夹以供以后处理。

Primary.Folder     |   Sub.folder |Start.Image..         |End.Image.. 

   RPU_03262019_05092019 | 100EK113 | 2019-03-26-11-23-46 | 2019-03-26-11-32-02          
   RPU_03262019_05092019 | 100EK113 | 2019-03-27-08-35-00 | 2019-03-27-08-35-00                
   RPU_03262019_05092019 | 101EK113 | 2019-03-31-00-29-58 | 2019-03-31-00-59-58                
   RPU_03262019_05092019 | 101EK113 | 2019-03-31-01-44-58 | 2019-03-31-01-59-58                
   RPU_03262019_05092019 | 101EK113 | 2019-03-31-03-14-58 | 2019-03-31-03-44-58                
   RPU_03262019_05092019 | 101EK113 | 2019-03-31-04-34-58 | 2019-03-31-04-39-58                
   RPU_03262019_05092019 | 101EK113 | 2019-03-31-05-04-58 | 2019-03-31-05-14-58                
   RPU_03262019_05092019 | 101EK113 | 2019-03-31-05-44-58 | 2019-03-31-05-44-58                
   RPU_03262019_05092019 | 101EK113 | 2019-03-31-19-30-58 | 2019-03-31-19-40-58  

通过拥有所有图像的列表,我希望循环遍历每一行并构建一个新的动物主题照片列表,我可以将它们归档。复制到另一个文件夹中。我希望在这方面能有所帮助。

到目前为止,我已经从总照片列表中的每个文件中删除了 .JPG,以匹配排序后的 csv 中的内容,将 Start.Image.. 列分隔到 t1,将 End.Image.. 列分隔到 t2,并测试了一个 for 循环看看他们是否排队。

fn <- photolist %>% str_replace_all('\\.JPG', '')
t1 <- csvfilled[,4]
t2 <- csvfilled[,5]

#test
for (i in t1) for (j in t2) {
  print(paste(i,j,sep=","))
  }

# using between() function
for (i in t1) {
  for (j in t2){
  finalsortedlist<- (fn[between(fn,i, j)])
    } 
}

测试结果显示 i 和 j 同时运行。看来 i 等待 j 循环通过,然后继续循环 j 再次循环。

 "2019-05-09-09-24-24, 2019-05-08-18-35-24"
 "2019-05-09-09-24-24, 2019-05-08-19-05-24"
 "2019-05-09-09-24-24, 2019-05-08-19-50-24"
 "2019-05-09-09-24-24, 2019-05-09-00-09-24"
 "2019-05-09-09-24-24, 2019-05-09-09-59-24"
 "2019-05-09-09-24-24, 2019-05-09-10-49-24"

有没有办法像下面这样按顺序运行它们?

"2019-03-26-11-23-46, 2019-03-26-11-32-02"          
"2019-03-27-08-35-00, 2019-03-27-08-35-00"                
"2019-03-31-00-29-58, 2019-03-31-00-59-58"                
"2019-03-31-01-44-58, 2019-03-31-01-59-58"                
"2019-03-31-03-14-58, 2019-03-31-03-44-58"                
"2019-03-31-04-34-58, 2019-03-31-04-39-58"                
"2019-03-31-05-04-58, 2019-03-31-05-14-58"                
"2019-03-31-05-44-58, 2019-03-31-05-44-58"               
"2019-03-31-19-30-58, 2019-03-31-19-40-58"  

我基本上想要:

"1,1"
"2,2"
"3,3"
"4,4"

代替

"1,1"
"1,2"
"1,3"
"1,4" 
"2,1"
"2,2"
"2,3"
"2,4"

标签: r

解决方案


使用 purrr 库中的“map2”将相当简单。

finalsortedlist <- map2(t1, t2, ~fn[between(fn, .x, .y)])

本质上,map2 将从 t1 和 t2 中获取第 n 个项目,并将它们分别作为 .x 和 .y 传递给您的函数。结果将是一个包含每次迭代结果的列表。


推荐阅读