将数据帧输出保存到多个文件夹

时间:2018-07-18 13:36:53

标签: r url

原谅我的新手,但是我觉得我已经到了机智的尽头。

我有一个(空间多边形)数据框(tri.extract),其中包含我的所有数据。此数据帧中的每一行都对应一个图像。数据帧中的每个图像都对应一个宗地,因此具有属性parcel_id,该属性表示该图像属于哪个宗地。我希望将所有图像保存在子文件夹中,以便每个图像都位于其各自包裹的文件夹中。

parcels <- data.frame(unique(tri.extract@data$parcel_id))
save.dir <- "/home/iordamo/Documents/GIS_Workload/bbox/DemoGrasslandTIMED_END_ImagesMapillary/"

#create sub-folders named after parcel_ids
for (i in 1:nrow(parcels)){
     dir.create(paste0(save.dir,parcels[i,]))
     }

#the save loop itself
for (i in 1:nrow(tri.extract@data)){

  #generate URLs for each image in the dataframe
  img_url<-paste0('https://d1cuyjsrcm0gby.cloudfront.net/',
                  tri.extract@data$key[i],
                  '/thumb-2048.jpg')

  #create a dataframe of all the folder names within save.dir - the parcels 
  dirs.to.save1 <- data.frame(list.files(save.dir, recursive = F))
  dirs.to.save1[] <- lapply(dirs.to.save1, as.character)

  for (g in 1:nrow(dirs.to.save1)){
    if (g==1){
      row <- dirs.to.save1[g,]
      #print(row)
      img_path <- file.path(paste0(save.dir,row, "/"), paste0("i_",tri.extract@data$key[i], ".jpg"))
      download.file(img_url, img_path, quiet=TRUE, mode="wb")
      #next
    }

    else if (g>1){
      row <- dirs.to.save1[g,]
      #print(row)
      img_path <- file.path(paste0(save.dir,row, "/"), paste0("i_",tri.extract@data$key[i], ".jpg"))
      download.file(img_url, img_path, quiet=TRUE, mode="wb")
      #next
    }

  }
}

使用当前形式的代码,所有图像都保存在所有子文件夹中。谁能解释为什么?据我了解,我正在遍历数据帧(tri.extract)的每个记录,生成一个URL,然后(在第一个嵌套循环中)遍历每个宗地,并从{{1} }和file.path数据框中的每一行以及相应的图像ID(save.dir)。这应该在每个相应的文件夹中输出,因为我在嵌套循环中对其进行循环。有人可以向我解释我的逻辑未能转化为执行的地方吗?

1 个答案:

答案 0 :(得分:0)

好吧,这并不难。

与往常一样,解决方案比我最初想象的要简单:

for (i in 1:nrow(tri.extract@data)){

  img_url<-paste0('https://d1cuyjsrcm0gby.cloudfront.net/',
                  tri.extract@data$key[i],
                  '/thumb-2048.jpg')

  for (g in 1:nrow(parcels)){
    row <- droplevels(parcels[g,])
    if(tri.extract@data$parcel_id[i] == parcels[g,]) {
      img_path <- file.path(paste0(save.dir,row), paste0("i_",tri.extract@data$key[i], ".jpg"))
      download.file(img_url, img_path, quiet=TRUE, mode="wb")
    }}
}