Snakemake 不读取 R 中的完整文件?
Snakemake doesn't read full file in R?
我正在使用一些快速 R 脚本在执行量化后 cbind 文件 (kallisto/salmon)。
问题是,我收到一个 R 错误,说我的输入文件长度不一样,所以 cbind() 将不起作用。
这显然不是这种情况,它们都是 16887 行(用 bash wc 检查),并且在没有 snakemake 的 R 中它工作得很好。
另外值得一提的是,我确实得到了随机样本数(~ 1 到 4)的输出。
这是 R 代码:
sample <- read.table(snakemake@input[[1]], sep = "\t", header = TRUE)
if (!file.exists(snakemake@params[[1]])) {
merge <- data.frame(sample)
} else {
merge1 <- read.table(snakemake@params[[1]], sep = "\t", header = TRUE)
merge <- cbind(merge1, sample[,2, drop=F])
}
write.table(merge, snakemake@params[[1]], sep = "\t", quote = F, row.names = F)
file.create(snakemake@output[[1]])
和 snakemake 规则:
rule merge_quantif:
input:
QUANTIF+"/{sample}/quantif.txt"
output:
QUANTIF+"/{sample}/merge.done"
params:
QUANTIF+"/all_sample_quantified.txt"
script:
"Tools/merge_quantif.R"
我的文件是这样的:
Gene R1
A1BG 0.287571
A1CF 0
A2M 0.198756
A2ML1 0
A2MP1 0
A3GALT2 0
A4GALT 3.098108
输出应该是这样的,但是包含所有 17 个样本
Gene R4 R8 R15 R13
A1BG 0.337515 0.284943 0.488654 0.587114
A1CF 0 0 0 0
A2M 0 0 0.105159 0.009539
如果有人有解决此问题的想法,将不胜感激。
------------ 编辑
修改 R 代码以与 asnwer 一起使用:
sample <- snakemake@input
merge <- read.table(sample[[1]], sep = "\t", header = T)
for (i in 2:length(sample)) {
x <- read.table(sample[[i]], sep = "\t", header = T)
merge <- merge(merge, x, by="Gene")
}
write.table(merge, snakemake@output[[1]], sep = "\t", quote = F, row.names = F)
我认为问题在于规则 merge_quantif
对每个样本执行,即 17 次,可能是并行的。但是,merge_quantif
的每个 运行 都写入同一个输出文件 (QUANTIF+"/all_sample_quantified.txt"
),因为在你的 R 脚本中你有 write.table(merge, snakemake@params[[1]], ...)
。我怀疑这会导致问题或至少不是理想的设置。我怀疑你想要的是这样的:
rule merge_quantif:
input:
expand(QUANTIF+"/{sample}/quantif.txt", sample= list_of_samples)
output:
QUANTIF+"/all_sample_quantified.txt"
script:
"Tools/merge_quantif.R"
其中Tools/merge_quantif.R
逐个读取输入文件列表,合并它们,最后将合并后的文件写入QUANTIF+"/all_sample_quantified.txt"
我正在使用一些快速 R 脚本在执行量化后 cbind 文件 (kallisto/salmon)。
问题是,我收到一个 R 错误,说我的输入文件长度不一样,所以 cbind() 将不起作用。
这显然不是这种情况,它们都是 16887 行(用 bash wc 检查),并且在没有 snakemake 的 R 中它工作得很好。
另外值得一提的是,我确实得到了随机样本数(~ 1 到 4)的输出。
这是 R 代码:
sample <- read.table(snakemake@input[[1]], sep = "\t", header = TRUE)
if (!file.exists(snakemake@params[[1]])) {
merge <- data.frame(sample)
} else {
merge1 <- read.table(snakemake@params[[1]], sep = "\t", header = TRUE)
merge <- cbind(merge1, sample[,2, drop=F])
}
write.table(merge, snakemake@params[[1]], sep = "\t", quote = F, row.names = F)
file.create(snakemake@output[[1]])
和 snakemake 规则:
rule merge_quantif:
input:
QUANTIF+"/{sample}/quantif.txt"
output:
QUANTIF+"/{sample}/merge.done"
params:
QUANTIF+"/all_sample_quantified.txt"
script:
"Tools/merge_quantif.R"
我的文件是这样的:
Gene R1
A1BG 0.287571
A1CF 0
A2M 0.198756
A2ML1 0
A2MP1 0
A3GALT2 0
A4GALT 3.098108
输出应该是这样的,但是包含所有 17 个样本
Gene R4 R8 R15 R13
A1BG 0.337515 0.284943 0.488654 0.587114
A1CF 0 0 0 0
A2M 0 0 0.105159 0.009539
如果有人有解决此问题的想法,将不胜感激。
------------ 编辑 修改 R 代码以与 asnwer 一起使用:
sample <- snakemake@input
merge <- read.table(sample[[1]], sep = "\t", header = T)
for (i in 2:length(sample)) {
x <- read.table(sample[[i]], sep = "\t", header = T)
merge <- merge(merge, x, by="Gene")
}
write.table(merge, snakemake@output[[1]], sep = "\t", quote = F, row.names = F)
我认为问题在于规则 merge_quantif
对每个样本执行,即 17 次,可能是并行的。但是,merge_quantif
的每个 运行 都写入同一个输出文件 (QUANTIF+"/all_sample_quantified.txt"
),因为在你的 R 脚本中你有 write.table(merge, snakemake@params[[1]], ...)
。我怀疑这会导致问题或至少不是理想的设置。我怀疑你想要的是这样的:
rule merge_quantif:
input:
expand(QUANTIF+"/{sample}/quantif.txt", sample= list_of_samples)
output:
QUANTIF+"/all_sample_quantified.txt"
script:
"Tools/merge_quantif.R"
其中Tools/merge_quantif.R
逐个读取输入文件列表,合并它们,最后将合并后的文件写入QUANTIF+"/all_sample_quantified.txt"