Перемещение папок в разные папки - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть каталог (Windows-машина), содержащий много папок.Я хотел бы разбить эти папки на пакеты по три и переместить их в отдельные подкаталоги.

ID <- c("a", "b", "c", "d", "e", "f")
group <- c("gp1", "gp1","gp1","gp2","gp2","gp2")
samples <- as.data.frame(cbind(ID,group))

  id group
1  a   gp1
2  b   gp1
3  c   gp1
4  d   gp2
5  e   gp2
6  f   gp2

Итак, мой рабочий каталог содержит папки af, и я хочу переместить файлы ac в подкаталогназывается gp1, и df в подкаталог с именем gp2.(На самом деле у меня более ста таких папок, это всего лишь небольшой пример, и каждая папка содержит несколько больших файлов).

Это то, что у меня есть:

# find number of samples
nSamps <- nrow(samples)

# calculate how many groups are required
nGrps <- ceiling(nrow(samples)/3)

# list of batch files we want to create 
Batchlist <- 1:nGrps

# create folders with appropriate batch number 
for (i in Batchlist){
dir.create(paste("batch",i,sep=""))
} 

# assign a group name to each sample 
fileList <- rep(Batchlist, each = 3, len = nrow(samples))

# assign each sample a folder name 
samples$group <- paste("batch",fileList, sep = "")   

Вот где я застреваю.Я попытался написать цикл, который перемещает каждую папку в соответствующий подкаталог, однако он перемещает все папки, а не пакетами (поэтому я получаю копии папок af в «batch1» и «batch2»)

for (j in samples$group){
  for (i in samples$ID){
    setwd(paste("file/path","/",j,sep = ""))
    dir.create(file.path(i))
    setwd("../")
    file.rename(from = i, to = paste(j,"/", i, sep = ""))
  }
}

Я пробовал несколько других вещей (например, написание небольшой функции и использование sapply), но цикл - самый близкий, который я получаю.

Может кто-нибудь указать мне правильное направление, где я иду не так?

1 Ответ

0 голосов
/ 18 февраля 2019

Это сработало для меня.Вместо вашего последнего цикла используйте:

for (i in 1:nrow(samples)){
  dir=which(dir()==samples$group[i])
  dir.create(paste0(dir()[dir],"/",samples$ID[i]))
}

Функция dir() возвращает все существующие объекты в каталоге.Сопоставьте каждую строку с именем пакета и создайте в нем каталог.

...