将R绘图命令转换为许多文件的循环

时间:2019-05-21 09:14:29

标签: r loops ggplot2 plot dplyr

目前,我一直在使用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

所有txt文件都位于同一目录中,并且所有txt文件都受到关注。

2 个答案:

答案 0 :(得分:2)

首先收集感兴趣文件的完整路径

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 :(得分:1)

我会做类似以下的事情。

将其更改为实际值。

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)