目前,我一直在使用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文件都受到关注。
答案 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)