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

Итак, у меня есть каталог .txt файлов. Каждый содержит столбцы, представляющие особенности некоторого измерения. Для файлов в том же каталоге я хочу заменить содержимое одного столбца с именем treatmentsum на 3S_TNFaCHx_cluster1_333nM+0.1ug/ml_none. (Я заменю один и тот же столбец с разными именами в разных папках, и да, я знаю, что это имя крайне раздражает, поверьте мне, есть гораздо худшие имена)

Поэтому я подумал, что заменить столбец в кадре данных легко Я просто открываю каталог, затем делаю следующее:

df <- read.table(x, header=TRUE)
df$treatmentsum <- c("3S_TNFaCHx_cluster1_333nM+0.1ug/ml_none")

Далее мне просто нужно сделать эту функцию и lapply ее для всех файлов в каталоге и убедиться, что новые файлы помещены в новый папка.

Полный код не работает:

#set up directories
directory <- "C:/Users/XXX"
outdirectory <- "C:/Users/XXX/replaced"

#find all .txt files in the directory
files <- list.files(path=directory, pattern="*.txt", full.names=TRUE, recursive=FALSE)

lapply(files, function(x) {
    df <- read.table(x, header=TRUE)
    df$treatmentsum <- c("the new stupid name thanks to pharma")
    out <- function(df)
    # write to file
    write.table(out, outdirectory, sep="\t", quote=FALSE, row.names=FALSE, col.names=TRUE)
})

предупреждение, которое я получил:

Ошибка сканирования (файл = файл, что = что , sep = sep, quote = quote, de c = de c,: в строке 1 не было 744 элементов

1 Ответ

1 голос
/ 29 января 2020

Я попытался создать структуру папок и протестировал следующий код. Кажется, работает.

source_folder <- "Folder1"
destination_folder <- "Folder2"

files <- list.files(path = source_folder, pattern = "*.txt", 
                    full.names = TRUE, recursive = FALSE)

lapply(files, function(x) {
  df <- read.table(x, header=TRUE)
  df$Col2 <- c("the new stupid name thanks to pharma")
  write.table(df, paste0(destination_folder,"/", basename(x)), sep="\t", 
              quote=FALSE, row.names=FALSE, col.names=TRUE)
})
...