2014-06-08 6 views
0

R에 2 개의 목록을 정렬하고 두 요소를 가장 긴 길이로 교차 시키려합니다. 예 : 여기 R 목록의 요소를 주문하십시오.

Membership1 
[[1]] 
[1] 3 4 6 7 8 

[[2]] 
[1] 5 13 23 

[[3]] 
[1] 1 2 12 14 15 16 18 21 25 28 

Membership2 
[[1]] 
[1] 8 13 20 21 23 

[[2]] 
[1] 3 6 7 

[[3]] 
[1] 1 2 4 5 10 15 17 19 24 25 29 

이 결과가 될 것이다 :

[[3]] 
    [1] 1 2 12 14 15 16 18 21 25 28 
[[1]] 
    [1] 3 4 6 7 8 
[[2]] 
    [1] 5 13 23 

[[3]] 
    [1] 1 2 4 5 10 15 17 19 24 25 29 
[[1]] 
    [1] 8 13 20 21 23 
[[2]] 
    [1] 3 6 7 

그리고 1, 2, 15, 258

(모두 [[3]]의 교 차)이 교차 함수 인 꽤 straighforward,하지만 난 이해가 안 돼요. 그 목록을 내가 원하는대로 주문하는 법.

마누엘

답변

1

목록을 주문하려면, w.r.t. @flodel 제안으로는 다음과 같이 마지막 단계가 수행 될 수있다,

Membership1 <- list(c(3, 4, 6, 7, 8), c(5, 13, 23), c(1, 2, 12, 14, 15, 16, 18, 21, 25, 28)) 
Membership2 <- list(c(8, 13, 20, 21, 23), c(3, 6, 7), c(1, 2, 4, 5, 10, 15, 17, 19, 24, 25, 29)) 
Membership1 <- Membership1[order(sapply(Membership1, length), decreasing=TRUE)] 
Membership2 <- Membership2[order(sapply(Membership2, length), decreasing=TRUE)] 
lapply(seq_along(Membership1), function(i) intersect(Membership1[[i]], Membership2[[i]])) 
## [[1]] 
## [1] 1 2 15 25 
## 
## [[2]] 
## [1] 8 
## 
## [[3]] 
## numeric(0) 

등가 적 : 요소의 길이, nonincreasingly, 호출

x <- list(1:5, 1:3, 1:7) 
(x <- x[order(sapply(x, length), decreasing=TRUE)]) 
## [[1]] 
## [1] 1 2 3 4 5 6 7 
## 
## [[2]] 
## [1] 1 2 3 4 5 
## 
## [[3]] 
## [1] 1 2 3 

를 따라서, 모든 작업은 예를 해결할 수있다 :

Map(intersect, Membership1, Membership2) 

또는 :

mapply(intersect, Membership1, Membership2, SIMPLIFY=FALSE) 
+0

이것은 아주 좋습니다. 다들 감사 해요! –

관련 문제