R 将一个文件夹(带图像)拆分为两个,并将图像移动到新文件夹

R 将一个文件夹(带图像)拆分为两个,并将图像移动到新文件夹,r,split,directory,R,Split,Directory,我有一个叫train的文件夹,它包含两个子文件夹hot_dog和not_hot_dog。从第一个文件夹序列中,我想随机从两个子文件夹hot_dog和not_hot_dog中选择图像,并将它们放入一个名为validation的新文件夹中。此验证文件夹又有两个子文件夹,分别称为“热狗”和“非热狗”。随机选择的图像数量应约为原始图像数量的20%。在新文件夹验证下随机选择并保存的图像应在原始文件夹序列中删除 当前文件夹结构如下所示: 文件夹结构的最终结果应如下所示: 下面是一个基本的R方法,可能适合您。

我有一个叫train的文件夹,它包含两个子文件夹hot_dog和not_hot_dog。从第一个文件夹序列中,我想随机从两个子文件夹hot_dog和not_hot_dog中选择图像,并将它们放入一个名为validation的新文件夹中。此验证文件夹又有两个子文件夹,分别称为“热狗”和“非热狗”。随机选择的图像数量应约为原始图像数量的20%。在新文件夹验证下随机选择并保存的图像应在原始文件夹序列中删除

当前文件夹结构如下所示:

文件夹结构的最终结果应如下所示:


下面是一个基本的R方法,可能适合您。这不是我所说的优雅,但它相对容易理解

确保将~/Stack Overflow/替换为列车目录所在的任何目录

简而言之,如果新目录还不存在,我们使用dir.create创建它们。然后,我们使用list.files列出两个培训目录中的每个目录中的文件。然后我们使用sample对这些文件进行采样。最后,我们使用file.copy将它们放置到新家中

setwd("~/Stack Overflow/")
sample.fraction <- 0.2
train.true.dir <- "train/hot_dog"
train.false.dir <- "train/not_hot_dog"
valid.true.dir <- "validation/hot_dog"
valid.false.dir <- "validation/not_hot_dog"
sapply(c("validation",valid.true.dir,valid.false.dir),function(x){dir.create(x,showWarnings = FALSE)})
true.files <- list.files(train.true.dir)
false.files <- list.files(train.false.dir)
true.sample <- sample(true.files,size = ceiling(length(true.files) * sample.fraction))
false.sample <- sample(false.files,size = ceiling(length(false.files) * sample.fraction))
sapply(true.sample,function(x){file.copy(paste(train.true.dir,x,sep="/"),paste(valid.true.dir,x,sep="/"))})
sapply(false.sample,function(x){file.copy(paste(train.false.dir,x,sep="/"),paste(valid.false.dir,x,sep="/"))})

首先,通过setwd将当前工作目录设置为文件夹序列所在的路径。然后运行以下代码:

# setwd("path/to/folder/train")
path1 <- file.path("train", c("hot_dog", "not_hot_dog"))
path2 <- file.path("validation", c("hot_dog", "not_hot_dog"))
dir.create("validation")
lapply(path2, dir.create)
Map(function(x, y){
  file <- dir(x) ; n <- length(file)
  file_selected <- file.path(x, sample(file, ceiling(n * 0.2)))
  file.copy(file_selected, y)
  file.remove(file_selected)
}, path1, path2)


这是我随后使用的最终代码:

path2 <- file.path(here(), "data/hot-dog-not-hot-dog/validation", c("hot_dog", "not_hot_dog"))
dir.create(file.path(here(), "data/hot-dog-not-hot-dog/validation"))
lapply(path2, dir.create)
Map(function(x, y){
  file <- dir(x) ; n <- length(file)
  file_selected <- file.path(x, sample(file, ceiling(n * 0.2)))
  file.copy(file_selected, y)
  file.remove(file_selected)
}, path1, path2)```

嗨,Lexal,欢迎来到Stack Overflow。您将此问题标记为[R]。这是因为您打算使用R统计编程语言执行此任务吗?如果是的话,你有没有尝试过任何代码?如果答案是肯定的,那么编写代码就更容易了。更多信息请参见。嘿-是的。我的意图是在[R]中运行此代码。由于我是一个相当初级的编码,我不能真正产生任何代码,这将是有用的在这个论坛。为什么要删除我标题中的R?我不想得到Python的答案。谢谢。难以置信…这是我的第一个堆栈溢出问题,我得到了一个正确的答案!!!20分钟内回答。你让我开心!!!很高兴能帮上忙。如果一个或多个答案是有用的,考虑接受一个和/或投票。另外一个问题,我想:用代码,我能够移动20%的原始文件到新的文件夹验证。不幸的是,这20%的照片仍留在文件夹中。我的意图是,我或多或少地将这20%从文件夹序列转移到新的文件夹验证。我编辑了我的答案,以删除这些文件。请一定要备份。真的很好。现在,它的工作如预期。伟大的非常感谢你的帮助!这也是一个非常好的解决方案。我试过了,成功了。不幸的是,我移到新文件夹验证的文件仍然存在于旧文件夹序列中。我必须在旧文件夹train中删除它们。@Lexal如果有任何答案解决了您的问题,请将首选答案标记为已接受。阅读更多关于接受答案的详细信息。非常感谢。
path2 <- file.path(here(), "data/hot-dog-not-hot-dog/validation", c("hot_dog", "not_hot_dog"))
dir.create(file.path(here(), "data/hot-dog-not-hot-dog/validation"))
lapply(path2, dir.create)
Map(function(x, y){
  file <- dir(x) ; n <- length(file)
  file_selected <- file.path(x, sample(file, ceiling(n * 0.2)))
  file.copy(file_selected, y)
  file.remove(file_selected)
}, path1, path2)```