2014-04-08 1 views
0

의 목록에서 여러 벡터와 일치하는이 같은 벡터의 목록이 있습니다 (에선택 및 R

>list 

[[1]] 

[1] "a" "m" "l" "s" "t" "o" 

[[2]] 

[1] "m" "y" "o" "t" "e" 

[[3]] 

[1] "n" "a" "s" 

[[4]] 

[1] "b" "u" "z" "u" "l" "a" 

[[5]] 

[1] "c" "m" "u" "s" "r" "i" "x" "t" 

1 - 첫째, 나는 요소의 가장 많은 표에서 벡터를 선택합니다을 이 경우 8 요소가있는 5 번째 벡터). 이것은 쉽다.

2 초 목록에서 이전 벡터와 길이가 같거나 다른 벡터를 모두 선택하고 이전 벡터와 교차시킵니다.

내가 가질 수있는 또 다른 가능성은 첫 번째 문자의 이름으로 선택하는 것입니다. 이 경우 목록에서 첫 번째와 네 번째 인 "a"또는 "b"로 시작하는 벡터를 선택하는 것과 동일합니다. 이 경우 내가 모르는 것은 목록에서 첫 번째 요소를 아는 여러 벡터를 선택하는 방법입니다.

3 - 마침내 최소한의 일치 횟수 만 남기고 싶습니다.

"b"로 시작하는 목록의 네 벡터. 그런 다음 나머지 벡터에 대해 프로세스를 다시 시작하지만 "교차"할 때 이미 4 번째 및 5 번째 벡터를 고려하십시오. 이 경우 두 번째 요소를 선택하고이 요소를 4 번째 및 5 번째의 "고유() 조합"과 교차시킵니다.

나는 내가 자신을 설명 했길 바래!. 3-4 "for"및 "if"루프없이 R에서이를 수행 할 수있는 방법이 있습니까? 다른 말로하면 lapply 또는 유사하게 그것을 사용하는 영리한 방법이 있습니까?

+0

입력 목록 및 원하는 결과를 '입력'하여 사람들이보다 쉽게 ​​도와 줄 수 있도록하십시오. [** 여기 **] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610)를 참조하십시오. 시도한 코드와 귀하의 필요를 충족시키지 못한 코드를 알려주십시오. 귀하의 시도를 공유하면 모두에게 도움이됩니다. 귀하가 시간을내어 자신을 도우려는 것을 보여 주었고 명백한 답을 되풀이하지 않아도되고보다 구체적이고 적절한 대답을 얻는 데 도움이됩니다. 건배. – Henrik

+0

막연한 설명을 드려 죄송합니다. 출력이 선택된 벡터의 첫 번째 문자가있는 목록 인 경우 작동합니다. 이 경우 "c" "b" "m" "n"이됩니다. 그리고 전체 루프가 설정되면 여기에 업로드 할 것입니다. 다시 미안 해요. – Javier

+0

어쨌든, 지금 해결되었습니다, 아마도 나는 여기로 빨리 뛰어 들었습니다 :) – Javier

답변

0

이 작업을 수행해야합니까?

list <- strsplit(list("amlsto", "myote","nas","buzula","cmsusrixt"), "") 
# find minimum length 
lens <- sapply(list, length) 
which.min(lens) 
# which are same or 1 shorter than previous 
inds <- which (lens==c(-1,head(lens, -1)) | lens==c(-1,head(lens,-1))-1) 
# get the intersections 
inters <- mapply(intersect, list[inds], list[inds-1], SIMPLIFY=FALSE) 
#Get items where first in vector is in target set 
target <- c("a","b") 
isTarget <- sapply(list, "[[",1) %in% target 

# Minimum number of overlaps 
which.min(lapply(inters, length))