2015-04-22 3 views
2

Я хочу удалить строки из моего data.frame, которые не имеют своей уникальной комбинации значений, повторяющихся> = 4 раза в кадре данных. В этом примере мне нужны строки 1,2,6 и 7, потому что значения IR, IR_OSR, 2 & привет повторяются 4 раза в этом примере.Subset data.frame на основе порогового числа комбинаций значений

> DB[1:5,c("MegaSite","General.location","ID","call.type")] 
    MegaSite General.location ID call.type 
1  IR   IR_OSR 2  hello 
2  IR   IR_OSR 2  hello 
3  IR   IR_OSR M   x 
4  IR   IR_OSR M   x 
5  IR   IR_OSR M   z 
6  IR   IR_OSR 2  hello 
7  IR   IR_OSR 2  hello 
     > dim(DB) 
[1] 25434 76 

Я попытался следующий код предлагается в другом недавнем вопросе (Finding value pairs that occur more than once in a data.table in R),

>DB[,.N>3 , list("MegaSite","General.location","ID","call.type")] 

однако я получаю эту ошибку

Error in drop && !has.j : invalid 'x' type in 'x && y' 

Вот ссылка на больший пример набора данных который имеет только соответствующие столбцы из моего фактического набора данных: DB_IRsample.txt

ответ

1

Попробуйте этот код:

> require(plyr) 
> result <- ddply(r,.(MegaSite,General.location,ID,call.type),nrow) 
> result <- result[result$V1 >= 4, ] 
> result 
    MegaSite General.location ID call.type V1 
1  IR   IR_OSR 2  hello 4 

Затем вы можете объединить исходные данные против этого result, чтобы отфильтровать строки, которые не происходят, по крайней мере в 4 раза:

> merge(r, result, all.y=TRUE, by=c("MegaSite", "General.location", "ID", "call.type")) 
    MegaSite General.location ID call.type V1 
1  IR   IR_OSR 2  hello 4 
2  IR   IR_OSR 2  hello 4 
3  IR   IR_OSR 2  hello 4 
4  IR   IR_OSR 2  hello 4 
+0

Благодаря это работает! Хотя я должен отметить, что мне нужно было применить слияние к новому объекту, например. DB2 <-merge (.... – Meelez