2009-09-23 3 views
10

좋아요, 나는 두 개의 이름이 지정된 목록을 가지고 있는데, 하나는 "예상 됨"이고 하나는 "관찰 됨"입니다. 이들은 임의의 데이터 유형으로 구조가 복잡 할 수 있습니다. 예상 목록에있는 것과 다른 관찰 된 목록의 요소 만 포함하는 새 목록을 가져 오려고합니다. 여기 예가 있습니다 :두 개의 R 명명 된 목록의 차이점을 얻으려면 어떻게해야합니까?

Lexp <- list(a=1, b="two", c=list(3, "four")) 
Lobs <- list(a=1, c=list(3, "four"), b="ni") 
Lwant <- list(b="ni") 

내가 원하는 결과입니다. 나는 이것을 시도했다 :

> setdiff(Lobs, Lexp) 
[[1]] 
[1] "ni" 

아니, 그 이름을 잃고, 나는 setdiff가 이름에주의를 기울이지 않는다고 생각하지 않는다. 순서는 분명 여기에 상관 없으며 = 1 b = 1과 일치하는과 일치하지 않기를 바랍니다.

좋은 접근 방법이 무엇인지 잘 모름 ... 이름 (Lobs) 목록을 반복하는 것이 있습니까? 어색하고 비 R 같아서, 실행 가능하지만 ... 우아한 아이디어가 있습니까?

답변

22

은 적어도이 경우

Lobs[!(Lobs %in% Lexp)]

에서 당신이 원하는 당신을 제공합니다.

+0

어제 디버깅을 위해 % in % 함수를 사용하고 있었고 그 것이 좋습니다. –

0

OK, I는 plyr 패키지를 사용하여 하나 개의 약간 둔각 않음을 발견 그래서

> Lobs[laply(names(Lobs), function(x) !identical(Lobs[[x]], Lexp[[x]]))] 
$b 
[1] "ni" 

을가 관찰 함수에서 배열의 이름을 얻어 이중 브래킷 인덱싱과 동일한을 (사용) 함수를 사용하여 하위 목록을 비교 한 다음 laply()의 결과 인 이진 배열을 사용하여 원래 관찰 된 함수에 색인을 붙입니다.

누구나 더 나은/청소기/섹시한/빠른 방법있어?

+1

당신은 plyr을 필요로하지 않습니다 : Lobs [sapply (이름 (Lobs), 기능 (x)! 동일 (Lobs [[x]), Lexp [[x]])]] – Marek

+0

. @ Harlan - 가능합니까? 동일한 구조를 갖는 두 목록 간의 백분율 차이를 찾으십니까? 나는 기대 한 것과 관찰 된 것과 얼마나 다른지 비교하려고 노력하고 있는가? –

관련 문제