如何通过提取特定行来创建变量?

How to make a variable by extracting specific line?

我有如下数据,基因名称(例如 ABCB9)中包含 SNP 名称(rs 编号或 c#_pos#)。在名为 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中输出这个?

我们可以稍微改变一下。使用 readLines 读取文件并删除 leading/lagging 空格 (trimws) 后,split 'lines1' 基于基于空白值创建的分组向量 (""), 从 list 元素中删除 """END" 字符串,然后设置 listnames 与每个的第一次观察list 元素 (sapply(lst1, [, 1)) 同时提取除第一个元素和 stack 之外的所有其他元素。

lines1 <- trimws(lines)
lst1 <- lapply(split(lines1, cumsum(lines1=="")), 
                function(x) x[!x %in% c("", "END")])

stack(setNames(lapply(lst1,`[`,-1), sapply(lst1, `[`,1)))
#            values    ind
#1       rs11057374  ABCB9
#2        rs7138100  ABCB9
#3  c22_pos41422393  ABCB9
#4       rs12309481  ABCB9
#5        rs1214748 ABCC10
#6         rs928578  HDAC9
#7       rs10883039  HDAC9
#8       rs12428035   HCN2
#9        rs9561933   HCN2
#10    c2_pos102345   HCN2
#11       rs3848077   HCN2
#12       rs3099362   HCN2

数据

lines <- readLines("yourdata.txt") 

不要使用处理过的文件,而是使用原始文件来获取 SNP 基因映射。正如您提到的,此数据是下面 plink command 的输出:

plink --file mydata --make-set gene.list --write-set

所以我们已经有了 gene.listmydata.map 文件。使用这 2 个文件,我们可以执行以下操作:

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 了解更多重叠合并 examples/functions。