Я новичок в R, так что простите, это просто.
Я читаю в какой-то таблице:
library(data.table)
require(magrittr); require(tidyr)
x=fread("merged_plot_SG", header=TRUE)
> head(x)
gene_id chr min_POS max_POS rs_id pvalue_G pvalue_E metaP
1 ENSG00000020922 11 94212567 95223359 rs11605546 0.1367 0.9353 0.2670442
2 ENSG00000020922 11 94212567 95223359 rs566917 0.2740 0.2275 0.9363864
3 ENSG00000020922 11 94212567 95223359 rs12286498 0.8961 0.3347 0.5552598
4 ENSG00000020922 11 94212567 95223359 rs7934178 0.9043 0.3353 0.5510581
5 ENSG00000020922 11 94212567 95223359 rs16924610 0.9047 0.3353 0.5507136
6 ENSG00000020922 11 94212567 95223359 rs2508783 0.8685 0.1382 0.3517432
...
в этой таблице я хочу извлечь все уникальные (x $ chr), в этом случае:
> unique(x$chr)
[1] 11 3 6 7 20 17 2 12 1 10 4 19 9 22
, чем для каждого из этих уникальных чисел, которые я хочу загрузить файл, как, например, первое здесь это 11, поэтому я бы сделал:
b=fread("/mydir/bed_chr_11.bed")
и следующие:
b=fread("/mydir/bed_chr_3.bed")
b=fread("/mydir/bed_chr_6.bed")
...
далее я бы сделал эти две операции:
x00=x %>%
inner_join(b, by = c("rs_id" = "V4")) %>%
select(gene_id, chr, rs_id, pvalue_G, pvalue_E, V2, V3)
x11=x00 %<>%
unite(snp, chr, V3, remove = FALSE)
итак, у меня будут все эти фреймы данных:
x11,x3,x6,x7,x20,x17,x2,x12,x1,x10,x4,x19,x9,x22
тогда я бы соединил их всех в одном фрейме данных и записал в файл:
x.n <- c('x11','x3','x6','x7','x20','x17','x2','x12','x1','x10','x4','x19','x9','x22')
x.list <- lapply(x.n, get)
xx=do.call(rbind, x.list)
colnames(xx)[6] <- "pvalue"
write.table(xx, "ready_plot_SG", quote=F, col.names=TRUE,row.names = F)
Не могли бы вы помочь, как сделать все это в одном скрипте и с помощью цикла?
Спасибо!
РЕДАКТИРОВАТЬ: следующий совет ниже я пришел к этой точке:
require(dplyr)
library(data.table)
require(magrittr); require(tidyr)
x=fread("merged_plot_RGL", header=TRUE)
num=unique(x$chr)
files=list.files(path = "/anika/bed/", pattern = "\\.bed$", full.names = FALSE)
data_dir <- "/anika/bed"
#loop over the initial files
for(i in num){
file <- paste0(data_dir,"/", "bed_chr_",num[i],".bed") # loaded .bed file
xx <- lapply(file, function(z){
b <- fread(z, header = TRUE)
data.table(
x %>%
inner_join(b, by = c("rs_id" = "V4")) %>%
select(gene_id, chr, rs_id, pvalue_G, pvalue_E, V2, V3) %>%
unite(snp, chr, V3, remove = FALSE)
)
})
#We can combine them using data.tables 'rbindlist'
x_final <- rbindlist(xx)
#now we can use data.tables 'fwrite' to output the table to a file
names(x_final)[6] <- "pvalue"
fwrite(x_final, "test_rgl.txt", quote = "F", col.names = TRUE, row.names = FALSE)
}
Но я получил эту ошибку:
Error: `by` can't contain join column `V4` which is missing from RHS
Execution halted