2009-09-23 20 views
10

Tamam, iki tane adlandırılmış listelem var, biri "beklenen" ve diğeri "gözlendi". Rasgele veri tipleri ile yapı içinde karmaşık olabilirler. Gözlenen listenin yalnızca beklenen listeden farklı unsurları içeren yeni bir liste almak istiyorum. İşte bir örnek: Lwant, sonucun ne olmasını istediğimi budur. Bunu denedim:İki R listelenen liste arasındaki farkı nasıl alabilirim?

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

İsim, bu ismi kaybeder ve setdiffin isimlere dikkat ettiğini sanmıyorum. Sipariş açıkça burada önemli değil ve ben a = 1'un b = 1 ile eşleşmesini istemiyorum.

İyi bir yaklaşımın ne olduğundan emin değil misiniz ... adlarının (Lobs) adlarının bir listesi üzerinden geçen bir şey? İşe yaramasa da, beceriksiz ve R-benzeri olmayan sesler ... Zarif fikirler var mı?

cevap

22

En azından bu durumda

Lobs[!(Lobs %in% Lexp)]

istediğiniz ne verir.

+0

Sadece debugging için% 'si% fonksiyonunu kullanıyordum ve bunu tavsiye ediyordum. –

0

Tamam, plyr paketi kullanılarak, tek bir hafif geniş yanıt bulundu: Yani

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

, gözlemlenen işlevinden dizinin adlarını alır, çift dirsek indeksleme ve aynı (kullanır) Alt listeleri karşılaştırmak için işlev, sonra orijinal() gözlenen orijinal işlevi içine indeksi() sonuçlanan ikili dizi kullanır.

Daha iyi/daha temiz/daha seksi/daha hızlı bir şekilde herkes var mı?

+1

Plyr'e ihtiyacınız yok: Lobs [sapply (isimler (Lobs), function (x)! Özdeş (Lobs [[x]], Lexp [[x]]))] – Marek

+0

. @ Harlan - Bu mümkün mü Aynı yapıya sahip iki liste arasındaki yüzde farkını bulmak için? Beklenenden ne kadar farklılık gösterdiğini karşılaştırmaya çalışıyorum? –

İlgili konular