2015-10-13 2 views
0

Предположим, что в кадре данных df имеется 5 столбцов от a1 до a5. Я хочу те строки df, которые имеют общие значения в столбцах a1 и a2.Строки в кадре данных с дублируемыми значениями в определенных столбцах

col=c("a1","a2") 
df1=df[,which(colnames(df)%in%col)] 
l=which(duplicated(df1)==TRUE) 
df2=df[l, ] 

В настоящее время df2 содержит только повторяющиеся строки. Я хочу добавить соответствующие строки с дублирующимися значениями.

Образец

a1=c(1:3,3,4) 
    a2=c("a1","a2","a2","a2","a1") 
    a3=c(1:5) 
    df=data.frame(a1,a2,a3) 
    df 
    a1 a2 a3 
1 1 a1 1 
2 2 a2 2 
3 3 a2 3 
4 3 a2 4 
5 4 a1 5 
    col1=c("a1","a2") 
    df1=df[,which(colnames(df)%in%col1)] 
    l=which(duplicated(df1)==TRUE) 
    df2=df[l, ] 
    df2 
    a1 a2 a3 
4 3 a2 4 

Но я хочу df2 быть

a1 a2 a3 
3 3 a2 3 
4 3 a2 4 

Одним из решений является поиск в ДФ .. но мой ДФ имеет около 10 миллионов строк .. поэтому такое решение является эффективным

+0

Пожалуйста показать небольшой пример и ожидаемый результат на основе этого – akrun

+0

, добавленного в Q, Pl снова ссылается на Q –

+1

Недавно был опубликован аналогичный вопрос 'df [duplicated (df [1: 2]) | duplicated (df [1: 2], fromLast = TRUE),] ' – akrun

ответ

1

попытаться вместо

l=which(duplicated(df1)==TRUE) 

использование

l=which(duplicated(df1) | duplicated(df1,fromLast = T)) 

, который должен работать для вас

0

Вы также можете попробовать это data.table решение для скорости. Я думаю, что с помощью клавиш может быть быстрее, в зависимости от размера таблицы против накладных ключей:

library(data.table) 

dt <- data.table(a1,a2,a3) 

setkey(dt, a1, a2) 

dups <- which(duplicated(dt)) 

dt[dt[dups, list(a1, a2)]] 

редактирования: смотрите комментарий Аруна ниже эксперт data.table препарата

+0

setkey будет работать для dataframe тоже ?? –

+0

data.frames не имеют ключей. вам нужно сделать что-то вроде 'library (data.table); dt <- as.data.table (df) ', чтобы сделать его' data.table', который наследует свойства 'data.frame', но добавляет много хороших вещей, таких как ключи. – C8H10N4O2

+0

получение errorError в setkeyv (x, cols, verbose = verbose, физический = физический): 4 аргумента, переданных в .Internal (nchar), для которого требуется 3 –

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