2015-10-09 3 views
1

У меня есть большой набор данных (более 500 000 строк), и я хочу отфильтровать его в R. Я просто хочу сохранить самую актуальную информацию, поэтому я подумал, что было бы неплохо просто сохраните строки, чьи элементы имеют вхождение больше некоторого значения. Например, у меня есть эти данные:Набор данных фильтра, основанный на вхождении

A  B 
2  5 
4  7 
2  8 
3  7 
2  9 
4  2 
1  0 

И я хочу сохранить строки, в которых элемент А строка имеет вхождение больше 1. В этом случае на выходе будет:

A  B 
    2  5 
    4  7 
    2  8 
    2  9 
    4  2 

I знаете, как это сделать для циклов и rbind, но так как набор данных, который я использую, очень большой, производительность сильно затруднена. Любой совет?

ответ

0

Мы можем сделать это, используя либо data.table, dplyr, либо base R методов. Используя data.table, мы преобразуем 'data.frame' в 'data.table' (setDT(df1)), сгруппированные по 'A', if, ноль больше 1, мы получаем подмножество Data.table (.SD).

library(data.table) 
setDT(df1)[, if(.N>1) .SD, by = A] 

Или мы используем dplyr. Мы группа по «А», filter группы, которые имеют NROWS больше, чем 1 (n() >1)

library(dplyr) 
df1 %>% 
    group_by(A) %>% 
    filter(n()>1) 

Или с помощью ave из base R, мы получаем логический индекс и использовать, чтобы подмножество набора данных

df1[with(df1, ave(seq_along(A), A, FUN=length))> 1,] 

Или без использования каких-либо группировок, мы можем использовать duplicated для получения индекса и подмножества

df1[duplicated(df1$A)|duplicated(df1$A, fromLast=TRUE),] 
Смежные вопросы