2015-01-17 8 views
6

Birkaç ids ve bir değeri olan R'de bir data.table var. Her bir kimlik grubu kombinasyonu için birkaç satır vardır. Bu satırlardan biri "değer" sütununda NA içeriyorsa, bu satırların tüm birleşimleriyle tüm satırları kaldırmak istiyorum. Örneğin, aşağıdaki tabloda, id1 == 2 ve id2 == 1 için tüm satırları kaldırmak istiyorum.Birden çok sütunun değerlerine göre R içindeki data.table satırlarını kaldırın.

Yalnızca bir kimlik sahibi olsaydım dat[!(id1 %in% dat[is.na(value),id1])] yapardım. Örnekte, bu, i1 == 2 olan tüm satırları kaldıracaktır. Ancak, birkaç sütun eklemeyi başaramadım. Eğer değerlerden herhangi NA ler ise id1 ve id2 kombinasyonu başına kontrol etmek ve daha sonra bu bütün kombinasyonunu kaldırmak isterseniz

dat <- data.table(id1 = c(1,1,2,2,2,2), 
        id2 = c(1,2,1,2,3,1), 
        value = c(5,3,NA,6,7,3)) 
+1

deneyin 'dat [! (Id1 == 2 ID2 == 1)] 'ya da' setkey (dat id1, ID2) [! J (2, 1)] ' – akrun

+0

Bunun, yukarıdaki basit örnekte çalışacağını biliyorum. Ancak, sorunun NA'larla çok sayıda satır olabileceğinden daha genel olması amaçlanmıştır. – lilaf

+1

Sanırım o dat [, eğer (hepsi (! Is.na (değer))) .SD,. (Id1, id2)] ' –

cevap

4

, grup başına if deyimi ekleyebilir ve sadece (.SD kullanarak) sonuçlarını almak Bu ifade TRUE döndürür.

dat[, if(!anyNA(value)) .SD, by = .(id1, id2)] 
# id1 id2 value 
# 1: 1 1  5 
# 2: 1 2  3 
# 3: 2 2  6 
# 4: 2 3  7 

Ya da benzer şekilde,

dat[, if(all(!is.na(value))) .SD, by = .(id1, id2)] 
+1

Tekrar teşekkürler! – lilaf

+0

'dat' tüm bu' .SD'lere bölmek ve bunları yığmak pahalıya mal olabilir. Bir alternatif (belki de daha hızlı?) Yaklaşımı, "dat [,! Any (is.na (value)), =" id1, id2 "] $ V1]' – Frank

+1

@ Frank’ı tutmak için satırları seçmek olacaktır. işe yaramayacak. Test ettin mi? –