2015-09-07 59 views
1

我有一个数据框和一列有蛋白质ID以及一堆无意义的东西,如下图所示。我想要的id始终是第4到第9个字符,所以我想遍历列并提取这些以将它们导出到另一个csv文件。该列还充满了我不想要的NA。我努力想出一个R中的循环,它将每次切出我想要的确切字符,如果有NA,则什么也不做,然后在找到空白时停止,因为这将是列表的结尾。列循环遍历R中的一列并提取字符

模拟例如

Prot Id's 
sp|IDIDID|PSKSJ_45HELI^sp|IDIDID|FRUEHFJ^HSLHFHG#%$^9y7hiuahl 
sp|IDIDID|PSKSJ_45HELI^spuegfuehfw3|IDIDID|FRUEHFJ^HDGFLFHEHFN 
NA 
NA 
sp|IDIDID|PSKSJ_45HELIWUEU^#H63hHU6e^sp|IDIDID|FRUEHFJ^HFGHG:WHFUWH^hfue 
NA 
sp|IDIDID|PSKSJ_45HELI^spJFBEFBUEBFE|IDIDID|FRUEHFJ^ 
NA 
NA 

,说IDIDID是我想要得到的部分,任何帮助将不胜感激

+0

听起来像一个'grep'解决方案。 – CephBirk

+0

'read.table(text = as.character(dd $ Prot_Ids),sep ='|',fill = TRUE)'把所有的ID放在不同的列中 – rawr

回答

3

使用substr函数来提取所需的范围:

x = c("sp|456879|sequence1","sp|121212|sequence2",NA) 
d = data.frame(Prot_Id = x) 
substr(d[!is.na(d$Prot_Id),],4,9) 

输出:

[1] "456879" "121212" 
+0

所以我把它放在里面,出于某种原因,它们根本不在我的prot_id中,而不是用于id'> jeff <-substr(anotation [!is.na(anotation $ prot_id),],4,9)的头字母和数字列表。 (jeff)' [1]“7775”,“2713”, – Sector

+0

然后,我扩展了切片,尝试将其放入上下文中并获取该jeff <-substr(anotation [!is.na(anotation $ prot_id) ,] 1,20)' '> head(jeff)' [1]“c(57775,2959,2960,”“c(12713,19248,1924”,所以我彻底混淆了 – Sector

+0

我也很困惑。 ..请参阅http://stackoverflow.com/help/mcve – pcantalupo