2015-09-07 110 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