2014-12-10 4 views
0

Я хочу разбить dataframe так, чтобы элементы, уникальные в определенном столбце, были отделены от неповторимых элементов. Таким образом, ниже dataframe будут разделены на два dataframes как такИзвлечение только уникальных строк из фрейма данных в R

id v1 v2 
1 1 2 3 
2 1 1 1 
3 2 1 1 
4 3 1 2 
5 4 5 6 
6 4 3 1 

в

id v1 v2 
1 2 1 1 
2 3 1 2 

и

id v1 v2 
1 1 2 3 
2 1 1 1 
3 4 5 6 
4 4 3 1 

, где они расщепляются на уникальность id колонны. duplicated не работает в этой ситуации, потому что строки 1 и 5 в верхнем фрейме данных не считаются дублирующими, то есть первое вхождение возвращает FALSE в duplicated.

EDIT

Я пошел с

dups <- df[duplicated(df1$id) | duplicated(df$id, fromLast=TRUE), ] 
uniq <- df[!duplicated(df1$id) & !duplicated(df$id, fromLast=TRUE), ] 

, который бежал очень быстро с моей 250000 строк dataframe.

+2

Это _is_ дубликата вопрос. Используйте 'duplicated() & duplicated (, fromLast = TRUE)'. Или просто посмотрите на 'методы (уникальные)' и увидите, что существует 'unique.dataframe', или вы можете работать над самим вектором для построения логического индекса с' df $ id% in% unique (df $ id) ' –

+0

'dat [with (dat, ave (id, id, FUN = length)) == 1,]; dat [с (dat, ave (id, id, FUN = length))> 2,] ' – rawr

ответ

1

Я думаю, что самый простой способ подойти к этой проблеме является с data.table и посмотреть, где у вас есть более чем на 1 счет на id

Данные

data <- read.table(header=T,text=" 
    id v1 v2 
    1 2 3 
    1 1 1 
    2 1 1 
    3 1 2 
    4 5 6 
    4 3 1 
") 

Код для пролитой ДАННЫЕ

library(data.table) 
setDT(data) 
data[, Count := .N, by=id] 

Уникальный стол по идентификатору

data[Count==1] 

    id v1 v2 Count 
1: 2 1 1  1 
2: 3 1 2  1 

Неуникальная таблица по идентификатору

data[Count>1] 

    id v1 v2 Count 
1: 1 2 3  2 
2: 1 1 1  2 
3: 4 5 6  2 
4: 4 3 1  2 
Смежные вопросы