2014-11-02 5 views
2

я могу получить дублируются строки в R на data.tabledt использованиемНайти дублированные строки с оригинальным

dt[duplicated(dt, by=someColumns)] 

Однако, я хотел бы получить пары дублирующих строк и «не-дублей», для примера рассмотрим dt :

col1, col2, col3 
    A  B C1 
    A  B C2 
    A B1 C1 

Теперь dt[duplicated(dt, by=c('col1', "col2")) бы мне что-то вдоль линий

col1, col2, col3 
    A  B C2 

Я хотел бы получить это вместе с рядом, что он не выбрал дублироваться, то есть

col1, col2, col3 
    A  B C1 
    A  B C2 

Сравнение скорости ответов:

> system.time(dt[duplicated(dt2, by = t) | duplicated(dt, by = t, fromLast = TRUE)]) 
    user system elapsed 
    0.008 0.000 0.009 
> system.time(dt[, .SD[.N > 1], by = t]) 
    user system elapsed 
77.555 0.100 77.703 
+0

Где это 'by' аргумент пришел? Я не вижу никаких параметров 'by' на странице справки для'? Duplicated'. Используете ли вы 'duplicated()' из пакета, а не 'base'? – Chase

+0

@Chase 'dt' - это' data.table', я забыл упомянуть об этом. – FooBar

+0

применяется такая же логика, просто обновлен мой ответ, чтобы отразить реализацию 'data.table'. – Chase

ответ

1

Я считаю, что это по существу, дубликат вопроса this, хотя я могу видеть, как вы, возможно, не нашли его ...

... вот ответ buildi нг от логики, изложенной в ссылочного вопрос:

dt <- read.table(text = "col1 col2 col3 
    A  B C1 
    A  B C2 
    A B1 C1", header = TRUE, stringsAsFactors = FALSE) 


idx <- duplicated(dt[, 1:2]) | duplicated(dt[, 1:2], fromLast = TRUE) 

dt[idx, ] 
#--- 
    col1 col2 col3 
1 A B C1 
2 A B C2 

Поскольку вы используете data.table, это, вероятно, что вы хотите:

library(data.table) 
dt <- data.table(dt) 
dt[duplicated(dt, by = c("col1", "col2")) | duplicated(dt, by = c("col1", "col2"), fromLast = TRUE)] 
#--- 
    col1 col2 col3 
1: A B C1 
2: A B C2 
+0

Используя ваш код для 'data.table', я получаю только вывод:' col1 col2 col3 1: A B C2'. Я думаю, это потому, что функция 'duplicate' для' data.table' не знает 'fromLast'. – FooBar

+0

@FooBar - Я предполагаю, что ваши данные. Таблица устарела, версия 1.9.4 явно поддерживает параметр 'fromLast': http://www.rdocumentation.org/packages/data.table/functions/duplicated – Chase

+0

Thats правда. Я волнуюсь об этом, но моя версия - «1.9.2», а «update.packages()» не обновит ее, по-видимому, думая о ее обновлении. – FooBar

2

Вы можете легко достичь этого только с помощью .N:

dt[, .SD[.N > 1], by = list(col1, col2)] 
## col1 col2 col3 
## 1: A B C1 
## 2: A B C2 

Edit:

Вы также можете попробовать использовать бинарный поиск, который является очень эффективным, хотя и кажется, что duplicated еще более эффективным

setkey(dt[, indx := .N, by = list(col1, col2)], indx)[!J(1)] 
## col1 col2 col3 
## 1: A B C1 
## 2: A B C2 
+0

Этот ответ «лучше» с точки зрения формулировки. Однако вложенная логика делает это '8500' раз медленнее, чем другое решение для моей' data.table'. – FooBar

+0

Я добавил решение для бинарного поиска, которое намного быстрее, но я согласен, что 'duplicated' очень эффективен. Хотя я действительно не понимаю, почему нельзя просто использовать Google. Чейз (как он сам упомянул) просто взял свой ответ из [здесь] (http://stackoverflow.com/questions/7854433/finding-all-duplicate-rows-including-elements-with-smaller-subscripts) –

Смежные вопросы