2013-10-17 18 views
1

我編輯我的資料,它看起來像下面:卸下從整個數據的「字」或忽略它

  Sequence  modifications      No_Ks No_Ks_modif diff 
1 AAAAGAAAVANQGKK  Acetyl Acetyl      2   2 0 
2 AAIKFIKFINPKINDGE  Acetyl Biotin Acetyl     3   3 0 
3 AAIKFIKFINPKINDGE  Acetyl Acetyl      3   2 1 
4 IKKVGYNPKTVPFVPIS  Acetyl Acetyl Acetyl Oxidation  3   4 -1 

No_Ks - >序列中的K總數 No_Ks_modif - >數改進的K的通過乙酰或生物素(應該是唯一的),但它也包括氧化,因此這就是爲什麼K的數量如果更高以及它們的總數被修改的原因。

我用下面的代碼來計算改進的K的數量(從序列):

# Count of modifications  
dataset[, No_Ks_modif := 6] 
dataset[V6 == "", No_Ks_modif := 5] 
dataset[V5 == "", No_Ks_modif := 4] 
dataset[V4 == "", No_Ks_modif := 3] 
dataset[V3 == "", No_Ks_modif := 2] 
dataset[V2 == "", No_Ks_modif := 1] 
dataset[V1 == "", No_Ks_modif := 0] 

# Retaining Acetyl/Biotin or no modification only 
dataset[, AB01 := TRUE] 
dataset[, AB02 := TRUE] 
dataset[, AB03 := TRUE] 
dataset[, AB04 := TRUE] 
dataset[, AB05 := TRUE] 
dataset[, AB06 := TRUE] 

dataset[V1 != "", AB01 := grepl(V1, pattern = "Acetyl|Biotin|Oxidation")] 
dataset[V2 != "", AB02 := grepl(V2, pattern = "Acetyl|Biotin|Oxidation")] 
dataset[V3 != "", AB03 := grepl(V3, pattern = "Acetyl|Biotin|Oxidation")] 
dataset[V4 != "", AB04 := grepl(V1, pattern = "Acetyl|Biotin|Oxidation")] 
dataset[V5 != "", AB05 := grepl(V2, pattern = "Acetyl|Biotin|Oxidation")] 
dataset[V6 != "", AB06 := grepl(V3, pattern = "Acetyl|Biotin|Oxidation")] 


dataset <- dataset[AB01 & AB02 & AB03 & AB04 & AB05 & AB06] 

如果我從代碼中刪除了「氧化」就不算數整行,這就是問題。

我看到兩種方式來做到這一點。一種方法可能只是將生物素和乙酰基作爲修飾,我的腳本無法做到。第二種方法是從所有列中移除「氧化」,但不知道如何去做。歡迎任何建議。

最後的愚蠢問題。有沒有辦法以正確的方式粘貼龐大的代碼,而不必按代碼的所有行4倍的空間?運行前只涉及2列全碼 數據集:

Sequence     modifications 
AAAAGAAAVANQGKK  [14] Acetyl (K)|[15] Acetyl (K) 
AAIKFIKFINPKINDGE [4] Acetyl (K)|[7] Acetyl (K) 

還有更多的行

編輯。

+0

是什麼'dataset'看起來像你運行所有之前碼? – mrip

+0

已編輯第一篇文章。 –

回答

3

確實有更簡單的方法來做到這一點。這是一個例子。首先,我將重建數據集的方式,我認爲它是:

> df=read.table(text="Sequence     modifications 
+ AAAAGAAAVANQGKK  '[14] Acetyl (K)|[15] Acetyl (K)' 
+ AAIKFIKFINPKINDGE '[4] Acetyl (K)|[7] Acetyl (K)'",h=T,stringsAsFactors = F) 
> dt<-data.table(df) 
> dt 
      Sequence     modifications 
1: AAAAGAAAVANQGKK [14] Acetyl (K)|[15] Acetyl (K) 
2: AAIKFIKFINPKINDGE [4] Acetyl (K)|[7] Acetyl (K) 

現在你可以使用strsplit做你的工作:

dt[,no_Ks:=lapply(strsplit(Sequence,""),function(x) sum(x=="K"))] 
dt[,no_Ks_modif:=lapply(strsplit(modifications," "), 
     function(x) sum(x %in% c("Acetyl","Biotin")))] 
dt 
##    Sequence     modifications no_Ks no_Ks_modif 
## 1: AAAAGAAAVANQGKK [14] Acetyl (K)|[15] Acetyl (K)  2   2 
## 2: AAIKFIKFINPKINDGE [4] Acetyl (K)|[7] Acetyl (K)  3   2 
+0

我認爲no_Ks應該算作「(K)」的出現而不是「K」。 OP應該在問題中提到它。 – TheComeOnMan

+0

與礦碼相比,這看起來要容易得多。 –

+0

出現一個小錯誤。你能幫助我:strsplit錯誤(序列,「」):非字符參數。數據集由data.table函數完成。你認爲這可能是一個原因嗎? –