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

时间:2016-04-14 03:55:33

标签: r matching

我有以下数据

ABCB9  
rs11057374  
rs7138100  
rs11057375  
rs12309481  
END  

ABCC10  
rs1214748  
END  

ABCC2  
rs928578  
rs10883039  
END  

ABCC4  
rs12428035  
rs9561933  
rs9302086  
rs3848077  
rs3099362    
END 

通过使用这些数据,我想使输出如下

rs11057374  ABCB9  
rs7138100   ABCB9  
rs11057375  ABCB9  
rs12309481  ABCB9  



rs1214748  ABCC10   



rs928578    ABCC2    
rs10883039  ABCC2    



rs12428035  ABCC4    
rs9561933   ABCC4    
rs9302086   ABCC4    
rs3848077   ABCC4    
rs3099362   ABCC4  

没有必要是否有空白和" END"

如何在R或linux中输出此输出?

1 个答案:

答案 0 :(得分:0)

我们用readLines读取数据集,删除任何尾随/前导空格(trimws),删除空白("")或“END”的元素,创建分组索引('i1')基于'rs'作为字符串中的起始字符的出现(基于提供的示例),基于'i1'('nm1'),{{1}提取'lines2'的第一个元素}'lines2'由'i1'设置,split元素的名称设置为'nm1',删除list的每个元素中的第一个观察点,并list将其转换为stack

data.frame

数据

lines1 <- trimws(lines)
lines2 <- lines1[!lines1 %in% c("END", "")]
i1 <- cumsum(!grepl("^rs", lines2))
nm1 <- lines2[ave(i1,i1, FUN=seq_along)==1]
stack(setNames(lapply(split(lines2, i1), `[`, -1), nm1))
#     values    ind
#1  rs11057374  ABCB9
#2   rs7138100  ABCB9
#3  rs11057375  ABCB9
#4  rs12309481  ABCB9
#5   rs1214748 ABCC10
#6    rs928578  ABCC2
#7  rs10883039  ABCC2
#8  rs12428035  ABCC4
#9   rs9561933  ABCC4
#10  rs9302086  ABCC4
#11  rs3848077  ABCC4
#12  rs3099362  ABCC4