Конвертировать R графические команды в цикл для многих файлов - PullRequest
1 голос
/ 21 мая 2019

В настоящее время я использую R для чтения в таблице и отображения некоторых данных, которые я сохраняю в виде файла png.Теперь у меня есть 100 файлов, и я хотел бы, чтобы этот процесс был автоматизирован, а не вручную менял путь 100 раз.

Кроме того, я хотел бы объединить 100 файлов в одну таблицу в R, которую я могу впоследствии проанализировать.Объединение будет в формате dplyr bind_rows, поскольку все файлы имеют одинаковые заголовки столбцов.Я сделал это, когда у меня есть две таблицы в R, но теперь, когда я использую цикл для последовательного чтения файлов.Что было бы лучшим способом сделать это в R?Заранее благодарим за любые предложения или помощь.

my_data <- read.table('/path/to/data/results/sample_1.txt', header = TRUE, sep = "\t")

ggplot(my data, aes(x=alt_freq)) + geom_histogram(color="black", fill="white", bins = 20) + xlim(c(0,1))

ggsave("/path/to/plots/sample_1.png", plot = last_plot(),width = 16, height = 9)

#append table to one large table in the format of dplyr::bind_rows(y, z)

Все входные файлы имеют одинаковые имена:

sample_1.txt
sample_2.txt
sample_3.txt

Файлы выглядят следующим образом:

sample_name position    alt_freq    ref_freq    sample_1_counts
sample 1    10  0.5 0.5 2
sample 1    20  0.25    0.75    4

Все текстовые файлы находятся в одном каталоге, и все текстовые файлы представляют интерес.

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Сначала соберите полный путь к интересующим файлам

library(ggplot2)
all_files <- list.files("/path/to/data/results", pattern = "sample_\\d+\\.txt$", 
             full.names = TRUE)

Затем создайте функцию для применения к каждому файлу

new_fun <- function(path_of_file) {
  my_data <- read.table(path_of_file, header = TRUE)

  ggplot(my_data, aes(x=alt_freq)) + 
   geom_histogram(color="black", fill="white", bins = 20) + xlim(c(0,1))

  ggsave(paste0(dirname(path_of_file), "/", sub("txt$", "png", 
  basename(path_of_file))), plot = last_plot(),width = 16, height = 9)
}

Мы используем paste0, чтобы создать путь для динамического сохранения графика, получив имя каталога и заменив окончание txt на png.

Затем используйте цикл lapply / map / for, чтобы применить new_fun к каждому файлу

lapply(all_files, new_fun)

Чтобы объединить все файлы в один фрейм данных, мы можем сделать

combined_data <- do.call(rbind, lapply(all_files, read.table, header = TRUE))

Если заголовок отличается для одного столбца, мы можем изменить имя столбца для этого конкретного столбца, а затем rbind. Так, например, если информация заголовка для столбца 1 отличается, мы можем сделать

combined_data  <- do.call(rbind, lapply(all_files, function(x) {
   df <- read.table(x, header = TRUE)
   names(df)[1] <- "new_header"
   df$filename <- basename(x)
   df
}))
1 голос
/ 21 мая 2019

Я бы сделал что-то вроде следующего.

Измените их на действительные значения.

in_dir <- '/path/to/data/results'
out_dir <- '/path/to/plots'

Теперь графики и привязки таблиц.

library(ggplot2)

old_dir <- getwd()
setwd(in_dir)

flnames <- list.files(pattern = '^sample_[[:digit:]]+\\.txt$')
data_list <- lapply(flnames, read.table, header = TRUE, sep = '\t')

lapply(seq_along(data_list), function(i){
  ggplot(data_list[[i]], aes(x = alt_freq)) + 
    geom_histogram(color = "black", fill = "white", bins = 20) + 
    xlim(c(0, 1))
  f <- sub('txt$', 'png', flname[i])
  outfile <- paste(out_dir, f, sep = '/')
  ggsave(outfile, plot = last_plot(),width = 16, height = 9)
})

data_all <- dplyr::bind_rows(data_list)

Окончательная очистка.

setwd(old_dir)

## NOT RUN
#rm(data_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...