2017-04-05 10 views
0

행 추적 :미등록 여러 dataframe 열의 값하지만 여러 값 세미콜론으로 분리 된 유전자 이름 동의어 이루어진와 열을 포함하는 데이터 프레임을 가질 수

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에 매핑하면 이 아닌 행을 식별 할 수 있습니다. map.

저는 현재 동의어를 구문 분석하는 strsplit 및 올라가지을 사용하고 있지만 각 동의어에서 온 어떤 행을 추적 잃게 :

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 
: 내가 원하는 것은 다음과 같습니다 뭔가

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

조언을 제공해 주시면 감사하겠습니다.

답변

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"