2009-09-23 25 views
10

OK, tôi có hai danh sách được đặt tên, một danh sách là "được mong đợi" và một danh sách được "quan sát". Chúng có thể phức tạp trong cấu trúc, với các kiểu dữ liệu tùy ý. Tôi muốn có một danh sách mới chỉ chứa những yếu tố của danh sách được quan sát khác với danh sách mong đợi. Dưới đây là ví dụ:làm cách nào để có được sự khác biệt giữa hai danh sách R được đặt tên?

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

Lwant là những gì tôi muốn kết quả. Tôi đã thử điều này:

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

Không, điều đó mất tên và tôi không nghĩ setdiff chú ý đến tên. Đặt hàng rõ ràng không quan trọng ở đây và tôi không muốn a = 1 để khớp với b = 1.

Không chắc chắn cách tiếp cận tốt là gì ... Thứ gì đó lặp qua danh sách tên (Lobs)? Âm thanh vụng về và không giống như R, mặc dù khả thi ... Có ý tưởng thanh lịch nào không?

Trả lời

22

Ít nhất trong trường hợp này

Lobs[!(Lobs %in% Lexp)]

mang đến cho bạn những gì bạn muốn.

+0

Tôi vừa mới sử dụng hàm% in% ngày hôm qua để gỡ lỗi và giới thiệu về điều đó. –

0

OK, tôi tìm thấy một câu trả lời hơi chậm hiểu, sử dụng plyr gói:

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

Vì vậy, phải mất tên của các mảng từ các chức năng quan sát, sử dụng lập chỉ mục đúp khung và giống hệt nhau () để so sánh các danh sách con, sau đó sử dụng mảng nhị phân kết quả từ laply() để lập chỉ mục vào hàm quan sát ban đầu.

Bất kỳ ai có cách tốt hơn/sạch hơn/hấp dẫn/nhanh hơn?

+1

Bạn không cần plyr: Lobs [sapply (tên (Lobs), function (x)! Giống hệt nhau (Lobs [[x]], Lexp [[x]]))] – Marek

+0

. @ Harlan - Có thể không để tìm sự khác biệt phần trăm giữa hai danh sách có cùng cấu trúc? Tôi đang cố gắng để so sánh bao nhiêu dự kiến ​​khác với quan sát? –

Các vấn đề liên quan