2017-04-05 67 views
0

我有一個包含與由分號分隔基因名稱的同義詞的多個值的列的數據幀的:不公開的多個值,但保持跟蹤的行號

score <- c("32.01","19.5","18.0") 
symbol <- c("30 kDa adipocyte complemen related protein","AAT1","Cachectin") 
synonym <- c("30 kDa adipocyte complemen related protein; 30 kDa adipocyte complement-related protein; ACDC; ACRP30; ADIPOQ; APM-1; APM1; Adipocyte C1Q and collagen domain containing","AAT1; AAT1; ALT-1; ALT1; Alanine aminotransferase; Alanine aminotransferase 1; GPT 1; GPT1; Glutamate pyruvate transaminase; Glutamic--alanine transaminase 1; Glutamic--pyruvic transaminase 1","Cachectin; TNF alpha; TNF-a; TNFA; TNFSF-2; TNFSF2; TNFalpha; Tumor necrosis factor; Tumor necrosis factor ligand superfamily member 2; Tumor necrosis factor precursor; tumor necrosis factor alpha") 
df <- data.frame(score, symbol, synonym, stringsAsFactors=FALSE) 

這是從數據輸出的原始礦業。我將數據中的官方基因符號映射到Entrez ID。符號列通常不包含基因符號,因此我必須提取所有同義詞(通常,列表中有官方符號)。我希望跟蹤行號的目標是,一旦我將所有符號映射到Entrez ID,我就可以識別那些沒有地圖的行。

我目前使用strsplit和不公開解析出的同義詞,但我失去跟蹤哪個行的每個代名詞來自:

tmp <- data.frame(unlist(strsplit(as.character(df$synonym), "; "))) 

我想要的東西,看起來像這樣:

originalRow <- c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3) 
cbind(tmp, originalRow) 

    synonym           originalRow 
1 30 kDa adipocyte complemen related protein   1 
2 30 kDa adipocyte complement-related protein   1 
3 ACDC             1 
4 ACRP30            1 
5 ADIPOQ            1 
6 APM-1            1 
7 APM1             1 
8 Adipocyte C1Q and collagen domain containing   1 
9 AAT1             2 
10 AAT1            2 
11 ALT-1            2 
12 ALT1            2 
13 Alanine aminotransferase       2 
14 Alanine aminotransferase 1       2 
15 GPT 1            2 
16 GPT1            2 
17 Glutamate pyruvate transaminase      2 
18 Glutamic--alanine transaminase 1     2 
19 Glutamic--pyruvic transaminase 1     2 
20 Cachectin           3 
21 TNF alpha           3 
22 TNF-a            3 
23 TNFA            3 
24 TNFSF-2            3 
25 TNFSF2            3 
26 TNFalpha           3 
27 Tumor necrosis factor        3 
28 Tumor necrosis factor ligand superfamily member 2 3 
29 Tumor necrosis factor precursor      3 
30 tumor necrosis factor alpha       3 

任何意見將不勝感激!

回答

1

在這裏,您可以拆分每一行,將行的值與行號合併爲一個data.frame,然後將所有這些data.frames綁定在一起。你可以這樣做

do.call("rbind", Map(data.frame, 
    synonym=strsplit(as.character(df$synonym), ";"), 
    origRow=seq_along(df$synonym)) 
) 
+0

不錯。我不知道seq_along。謝謝。 – user1357079

0

另一種方法是將同義詞存儲在一個列表,然後可以迭代通過比較符號數組。在單個列表元素中工作,不需要跟蹤原始行號。這也將裁剪空白進行比較。

lst <- lapply(synonym, function(x) trimws(unlist(strsplit(x, ";")))) 
lapply(lst, setdiff, symbol) # return values not in symbol array 

[[1]] 
[1] "30 kDa adipocyte complement-related protein" "ACDC"           
[3] "ACRP30"          "ADIPOQ"          
[5] "APM-1"          "APM1"           
[7] "Adipocyte C1Q and collagen domain containing" 

[[2]] 
[1] "ALT-1"       "ALT1"        "Alanine aminotransferase"   
[4] "Alanine aminotransferase 1"  "GPT 1"       "GPT1"        
[7] "Glutamate pyruvate transaminase" "Glutamic--alanine transaminase 1" "Glutamic--pyruvic transaminase 1" 

[[3]] 
[1] "TNF alpha"           "TNF-a"            
[3] "TNFA"            "TNFSF-2"           
[5] "TNFSF2"           "TNFalpha"           
[7] "Tumor necrosis factor"        "Tumor necrosis factor ligand superfamily member 2" 
[9] "Tumor necrosis factor precursor"     "tumor necrosis factor alpha"