2015-05-08 23 views
11

R'de bir vektör var, bunlardan bazıları yinelenenler gibi.Listeden bir sayının ilk oluşumunu kaldır

v<-c("d09","d11","d13","d01","d02","d10","d13") 

ve örneğin bu karakterlerin tek sayısını içeren bir vektör

x<-c("d10","d11","d13") 

2. vektörteki karakterleri ilk vektörden kaldırmak, ancak kopyaları saklamak istiyorum. Yukarıdaki örnekte,

Çeşitli şeyleri denemek isterim. z<-v[!(v %in% x)] ama bunlardan sadece bir x karakterlerin tüm örneklerini kaldırarak tutar, bu yüzden bu yerine ile sonuna kadar:

"d09", "d01", "d02" 

Ya sadece bir yinelenen öğenin bir örneğini kaldırmak için ne yapabiliriz?

cevap

12

match ve negatif endekslemeyi kullanabilirsiniz.

v[-match(x, v)] 

[1] "d09" "d01" "d02" "d13" 

match sadece biz burada bizim için avantaj kullandığınız bir değerin ilk maçında, yerini döndürür üretir. %in% ve is.elementmatch dejenere versiyonları olduğunu

Not. Karşılaştırma:

match(x, v)   # [1] 6 2 3 
match(x, v) > 0  # [1] TRUE TRUE TRUE 
x %in% v    # [1] TRUE TRUE TRUE 
is.element(x, v)  # [1] TRUE TRUE TRUE 

son üç

hepsi aynı ve temelde ( %in% ve is.element için aslında, bakınız kod) ilk mantıksal sürümüne zorladı. Bunu yaparken, v'daki x ilk eşleşmesinin yeri olan anahtar bilgileri kaybedersiniz ve yalnızcadeğerlerinin v içinde bulunduğunu bilerek bırakılır.

tersi, v %in% x tüm yinelenen değerleri olma koşulunu yerine gösterin çünkü bu şartını yerine getirmeyen, hangi "v hangi değerleri x içindedir" dır istediğini farklı bir şey anlamına gelir.

+0

Teşekkürler, bu mükemmel çalışıyor! – rw2

1

is.element

v[!is.element(v,x)] 
+3

Aslında, bu yanlış. Bu sadece OP ile aynı şey. – BrodieG

İlgili konular