2010-02-10 4 views
3

저는 R을 사용하고 있으며 초보자입니다. 두 개의 큰 목록 (각각 30K 개 요소)이 있습니다. 하나는 descriptions이고 각 요소는 (아마도) 토큰 화 된 문자열입니다. 다른 하나는 probes이고 각 요소는 숫자입니다. probes을 무언가에 descriptions에 매핑하는 사전을 만들어야합니다. 여기에 내가 이것에 대해 갈거야 방법은 다음과 같습니다조건이 포함 된 for 루프에 대한 R-Thonic 대체

probe2gene = {} 
for p,d in zip(probes, descriptions): 
    try: 
    probe2gene[p] = descriptions.split('//')[1] 
    except IndexError: 
    pass 

내 질문 : 잘 작동하지만 대략 동등한 파이썬보다 훨씬 느린, 느린

probe2gene <- list() 
for (i in 1:length(probes)){ 
strings<-strsplit(descriptions[i]), '//') 
if (length(strings[[1]]) > 1){ 
    probe2gene[probes[i]] = strings[[1]][2] 
} 
} 

는 "R은-thonic"이 내가하려는 일을하는 방법? R manual entry on for loops은 이러한 루프가 드문 것으로 나타났습니다. 더 나은 해결책이 있습니까?

편집 :

"NM_009826 // Rb1cc1 // RB1-inducible coiled-coil 1 // 1 A2 // 12421 /// AB070619 // Rb1cc1 // RB1-inducible coiled-coil 1 // 1 A2 // 12421 /// ENSMUST00000027040 // Rb1cc1 // RB1-inducible coiled-coil 1 // 1 A2 // 12421" 

나쁜 "설명 : 전형적인 좋은"설명 "과 같이 보입니다은 아주 쉽게 다른 될 수 있지만이

"-----" 

처럼 보이는하지-very- 도움이되는 문자열 각 프로브는 단순히 숫자입니다. probedescription 벡터는 길이가 같고 완전히 일치합니다. 즉 probe[i]description[i]으로 매핑됩니다.

+0

"R-thonic":) Ric이 아니어야합니까? – Skilldrick

+0

작은 데이터 샘플이 유용 할 것입니다. – Shane

+1

그것은 확실히 "piratical"입니다. – Harlan

답변

3

루프가 아닌 다양한 apply-like 함수를 사용하면 대개 R에서 더 좋습니다. 나는 이것이 당신의 문제를 해결한다고 생각합니다. 유일한 단점은 문자열 키를 사용해야한다는 것입니다.

> descriptions <- c("foo//bar", "") 
> probes <- c(10, 20) 
> probe2gene <- lapply(strsplit(descriptions, "//"), function (x) x[2]) 
> names(probe2gene) <- probes 
> probe2gene <- probe2gene[!is.na(probe2gene)] 
> probe2gene[["10"]] 
[1] "bar" 

불행히도 R에는 좋은 사전 /지도 유형이 없습니다. 내가 찾은 가장 가까운 것은 목록을 문자열 - 값에서지도로 사용하는 것입니다. 그것은 관용적 인 것처럼 보이지만 추악합니다.

+0

감사! 그것은 훨씬 빠릅니다. "strsplit"이 전체 벡터에 적용될 수 있다는 것을 깨달았습니다. 산뜻한! –

2

정확하게 이해할 경우 설명에 둘 이상의 (분할 된) 값이있는 각 프로브 설명 조합을 저장하려고합니까?

프로브와 설명은 같은 길이입니까?

이것은 지저분하지만 일종의 빠른 패스입니다.

a <- list("a","b","c") 
b <- list(c("a","b"),c("DEF","ABC"),c("Z")) 

names(b) <- a 
matches <- which(lapply(b, length)>1) #several ways to do this 
b <- lapply(b[matches], function(x) x[2]) #keeps the second element only 

저의 첫 번째 시도입니다. 매우 유용한 예제 데이터 세트가 있다면.

안부,

제이

+0

첫 번째 응답자가되기 어렵습니다.) – Jay

0

또 다른 방법. sapply에서

probe<-c(4,3,1) 
gene<-c('red//hair','strange','blue//blood') 
probe2gene<-character() 
probe2gene[probe]<-sapply(strsplit(gene,'//'),'[',2) 
probe2gene 
[1] "blood" NA  NA  "hair" 

, 우리는 R의 부분 집합 연산자는 함수라는 사실을 활용 '['우리는 인수로 인덱스를 통과 할 수있다. 또한 범위를 벗어난 인덱스는 오류를 일으키지 않지만 NA 값을 제공합니다. 같은 줄의 왼쪽에서 우리는 인덱스의 벡터를 어떤 순서와 간격으로도 전달할 수 있다는 사실을 사용합니다.

0

다른 접근 방법이 빠릅니다. 이 경우 은 빈 설명을 제거하지 않습니다.그렇게하기 위해 적응할 수도 있고 아니면 이 lapply를 사용하여 사후 처리 단계에서 이들을 제거 할 수도 있습니다. 케이스에 길이가 1에 대한 올바른 설명이 없습니까?

make_desc <- function(n) 
{ 
    word <- function(x) paste(sample(letters, 5, replace=TRUE), collapse = "") 
    if (runif(1) < 0.70) 
     paste(sapply(seq_len(n), word), collapse = "//") 
    else 
     "----" 
} 

description <- sapply(seq_len(10), make_desc) 
probes <- seq_len(length(description)) 

desc_parts <- strsplit(description, "//", fixed=TRUE, useBytes=TRUE) 
lens <- sapply(desc_parts, length) 
probes_expand <- rep(probes, lens) 
ans <- split(unlist(desc_parts), probes_expand) 


> description 
[1] "fmbec"                
[2] "----"                 
[3] "----"                 
[4] "frrii//yjxsa//wvkce//xbpkc"           
[5] "kazzp//ifrlz//ztnkh//dtwow//aqvcm"         
[6] "stupm//ncqhx//zaakn//kjymf//swvsr//zsexu"        
[7] "wajit//sajgr//cttzf//uagwy//qtuyh//iyiue//xelrq"      
[8] "nirex//awvnw//bvexw//mmzdp//lvetr//xvahy//qhgym//ggdax"    
[9] "----"                 
[10] "ubabx//tvqrd//vcxsp//rjshu//gbmvj//fbkea//smrgm//qfmpy//tpudu//qpjbu" 


> ans[[3]] 
[1] "----" 
> ans[[4]] 
[1] "frrii" "yjxsa" "wvkce" "xbpkc" 
관련 문제