R: переименование файлов с использованием элементов определенного столбца в кадре данных - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть папка с файлами .txt, у каждого есть длинные строковые имена, такие как "ctrl_Jack_DrugA_XXuM.txt". Однако в названии отсутствует важная строка, отметки времени.

Однако у меня есть эта информация в кадре данных внутри каждого файла. например, в каждом файле содержится несколько столбцов, один из столбцов называется «Pid_treatmentsum»: элементы в нем - «Jack_R4_200514_DrugA_XXuM.txt»

Поэтому, прежде чем перейти к нисходящему потоку, я хочу отсортировать файлы в подпапки, основанные на именах, таких как Джек и метка времени, таких как "R4_200514", и для этого мне нужно переименовать заголовок файла с помощью "Pid_treatmentsum".

Теперь код:

```
#create MRE
#file 1
Row <- c(rep("16", 20))
column <- c(rep("3", 20))
Pid<- c(rep("Jack", 20))
Stimulation<- c(rep("3S", 20))
Drug <- c(rep("2DG", 20))
Dose <-c(rep("3uM", 20))
Treatmentsum <-c(rep(paste("Jack","3S",'2DG','3uM',sep = "_"), 20))
PiD_treatmentsum <- c(rep(paste('Jack',"T4_20200501",'3S','2DG','3uM',sep = "_"), 20))
sampleset <-data.frame(Row,column,Pid,Stimulation,Drug,Dose,Treatmentsum,PiD_treatmentsum)
write.table(sampleset, file = "ctrl_Jack_3S_2DG_3uM.txt",sep="\t", row.names = F, col.names = T)

#file 2
Row <- c(rep("16", 40))
column <- c(rep("3", 40))
Pid<- c(rep("Mark", 40))
Stimulation<- c(rep("3S", 40))
Drug <- c(rep("STS", 40))
Dose <-c(rep("1uM", 40))
Treatmentsum <-c(rep(paste("Mark","3S",'STS','1uM',sep = "_"), 40))
PiD_treatmentsum <- c(rep(paste('Mark',"T5_20200501",'3S','STS','1uM',sep = "_"), 40))
sampleset <-data.frame(Row,column,Pid,Stimulation,Drug,Dose,Treatmentsum,PiD_treatmentsum)
write.table(sampleset, file = "ctrl_Mark_3S_STS_1uM.txt",sep="\t", row.names = F,col.names = T)

# rename all the files using their PiD_treatmentsum 
filenames <- list.files("C:/UsersXXX", pattern="*.txt")
outdirectory <- "~/out"
lapply(filenames, function(x) {
df <- read.csv(x,sep="\t", header=TRUE, fill = T,stringsAsFactors = F)
a <- as.character(unique(df[["PiD_treatmentsum"]]))
b<-paste0("ctrl_",a, '.txt', sep="")
newname <- file.rename(basename(x), b)
write.table(df, paste0(outdirectory,"/", newname, sep="\t", 
          quote=FALSE, row.names=F, col.names=TRUE)
})

Здесь говорится, что ошибка неожиданна.} Я думаю, что я, должно быть, облажался l oop.

Если я просто анализирую код и запускаю один файл в качестве примера, код работает:

  df <- read.csv('ctrl_Jack_3S_2DG_3uM.txt',sep="\t", header=TRUE, 
             fill = T,stringsAsFactors=F)

  a <- as.character(unique(df[["PiD_treatmentsum"]]))
  b<-paste0("ctrl_",a, '.txt', sep="")
  basename('ctrl_Jack_3S_2DG_3uM.txt')
  file.rename(basename('ctrl_Jack_3S_2DG_3uM.txt'), b)

```

Небольшая помощь и объяснение будет оценено :)

1 Ответ

1 голос
/ 25 февраля 2020

Это должно работать:

create MRE
#file 1
Row <- c(rep("16", 20))
column <- c(rep("3", 20))
Pid<- c(rep("Jack", 20))
Stimulation<- c(rep("3S", 20))
Drug <- c(rep("2DG", 20))
Dose <-c(rep("3uM", 20))
Treatmentsum <-c(rep(paste("Jack","3S",'2DG','3uM',sep = "_"), 20))
PiD_treatmentsum <- c(rep(paste('Jack',"T4_20200501",'3S','2DG','3uM',sep = "_"), 20))
sampleset <-data.frame(Row,column,Pid,Stimulation,Drug,Dose,Treatmentsum,PiD_treatmentsum)
write.table(sampleset, file = "ctrl_Jack_3S_2DG_3uM.txt",sep="\t", row.names = F, col.names = T)

#file 2
Row <- c(rep("16", 40))
column <- c(rep("3", 40))
Pid<- c(rep("Mark", 40))
Stimulation<- c(rep("3S", 40))
Drug <- c(rep("STS", 40))
Dose <-c(rep("1uM", 40))
Treatmentsum <-c(rep(paste("Mark","3S",'STS','1uM',sep = "_"), 40))
PiD_treatmentsum <- c(rep(paste('Mark',"T5_20200501",'3S','STS','1uM',sep = "_"), 40))
sampleset <-data.frame(Row,column,Pid,Stimulation,Drug,Dose,Treatmentsum,PiD_treatmentsum)
write.table(sampleset, file = "ctrl_Mark_3S_STS_1uM.txt",sep="\t", row.names = F,col.names = T)

Я изменил только три последние строки. Мы переименовываем файл, используя file.rename (newname теперь TRUE или FALSE, если произошла ошибка при переименовании)

Затем мы создаем outdirectory (он выдаст предупреждение, если dir уже существует, но ничего не будет перезаписано. Сначала мы можем проверить, существует ли outdir, и если да, опустить dir.create)

Наконец, мы используем file.copy, чтобы скопировать переименованный файл в outdirectory. Мы можем использовать file.path для объединения каталога и имени файла.

# rename all the files using their PiD_treatmentsum 
# and copy them to outdirectory
filenames <- list.files(".", pattern="*M\\.txt")
outdirectory <- "~/out"
lapply(filenames, function(x) {
  df <- read.csv(x, sep="\t", header=TRUE, fill = T,stringsAsFactors = F)
  a <- as.character(unique(df[["PiD_treatmentsum"]]))
  b<-paste0("ctrl_",a, '.txt', sep="")
    newname <- file.rename(basename(x), b)
    dir.create(outdirectory)
    file.copy(b, file.path(outdirectory, b))
})

Я бы предложил обновить имена переменных до чего-то более значимого, чтобы упростить будущий рефакторинг;)

...