我的数据如下所示,基因名称中包含的SNP名称(rs号或c#_pos#)(例如ABCB9)。在命名为c#_pos000000的SNP中,#的范围是1到22(染色体编号)
ABCB9
rs11057374
rs7138100
c22_pos41422393
rs12309481
END
ABCC10
rs1214748
END
HDAC9
rs928578
rs10883039
END
HCN2
rs12428035
rs9561933
c2_pos102345
rs3848077
rs3099362
END
通过使用这些数据,我想使输出如下
rs11057374 ABCB9
rs7138100 ABCB9
c22_pos41422393 ABCB9
rs12309481 ABCB9
rs1214748 ABCC10
rs928578 HDAC9
rs10883039 HDAC9
rs12428035 HCN2
rs9561933 HCN2
c2_pos102345 HCN2
rs3848077 HCN2
rs3099362 HCN2
没有必要是否有空白和" END"
如何在R或linux中输出此输出?
答案 0 :(得分:3)
我们可以略微区别地做到这一点。在使用readLines
阅读文件并删除前导/滞后空格(trimws
)后,split
根据基于空白值创建的分组向量删除'lines1'(""
),从""
元素中删除"END"
或list
字符串,然后设置names
的{{1}},并对每个{{1}进行第一次观察} element(list
[list
)同时提取除第一个元素以外的所有其他元素,并sapply(lst1,
。
, 1)
stack
答案 1 :(得分:1)
使用原始文件获取SNP Gene映射,而不是使用已处理的文件。正如您所提到的,此数据是plink command下面的输出:
plink --file mydata --make-set gene.list --write-set
所以我们已经有了 gene.list 和 mydata.map 文件。使用以下两个文件:
library(data.table)
# gene list file
geneList <- data.table(
chr = 1:2,
start = c(10, 40),
end = c(13, 45),
gene = paste0("gene_",1:2))
# chr start end gene
# 1: 1 10 13 gene_1
# 2: 2 40 45 gene_2
# map file
map <- data.table(
chr = c(1,1,1,2,2,2,3),
snp = paste0("snp_",1:7),
cm = 0,
bp = c(10,11,15,40,41,49,100))
# prepare for merging, rename colnames to match gene list colnames
map <- map[, list(chr, start = bp, end = bp, snp)]
# chr start end snp
# 1: 1 10 10 snp_1
# 2: 1 11 11 snp_2
# 3: 1 15 15 snp_3
# 4: 2 40 40 snp_4
# 5: 2 41 41 snp_5
# 6: 2 49 49 snp_6
# 7: 3 100 100 snp_7
# set key for merging
setkey(map, chr, start, end)
# merge and susbset snp and gene columns
foverlaps(geneList, map)[, list(snp, gene)]
# snp gene
# 1: snp_1 gene_1
# 2: snp_2 gene_1
# 3: snp_4 gene_2
# 4: snp_5 gene_2
另外,请参阅this post了解重叠示例/函数的更多合并。