2016-07-22 2 views
2

Есть много похожих вопросов, но я бы хотел сравнить 2 столбца и удалить все дубликаты в обоих столбцах, так что все, что осталось, - это уникальные наблюдения в каждом столбце , Примечание. Дубликаты не бок о бок. Если возможно, мне также нужен список дубликатов (а не только TRUE/FALSE). Благодаря!R Сравнение двухсторонних дубликатов в 2 столбцах

 C1 C2 
    1 a z 
    2 c d 
    3 f a 
    4 e c 

станет

 C1 C2 
    1 f z 
    2 e d 

с повторяющимся списком

duplicates: a, c 
+0

Вы можете отправить примерный кадр данных и ожидаемый результат? – Koba

+0

Добавлено! Спасибо заблаговременно – flightless13wings

+0

Что делать, если дубликаты перекрываются в строках? Например, одна строка имеет 'a', а другая - нет. Вы удалите всю строку? – Zelazny7

ответ

0

Вот базовый метод R с использованием duplicated и lapply.

temp <- unlist(df) 
# get duplicated elements 
myDupeVec <- unique(temp[duplicated(temp)]) 

# get list without duplicates 
noDupesList <- lapply(df, function(i) i[!(i %in% myDupeVec)]) 

noDupesList 
$C1 
[1] "f" "e" 

$C2 
[1] "z" "d" 

данные

df <- read.table(header=T, text=" C1 C2 
    1 a z 
    2 c d 
    3 f a 
    4 e c ", as.is=TRUE) 

Обратите внимание, что это возвращает список. Это гораздо более гибкая структура, поскольку, как правило, существует вероятность того, что уровень может повторяться более одного раза в определенной переменной. Если это не так, вы можете использовать do.call и data.frame, чтобы вывести результат в прямоугольную структуру.

do.call(data.frame, noDupesList) 
    C1 C2 
1 f z 
2 e d 
+0

Спасибо! Просто интересно, есть ли способ, который делает это для 10000 строк? – flightless13wings

+0

Это будет работать для строк 10K или 10M. 'unlist' помещает все это в длинный вектор. Это может усложниться с памятью и временем и т. Д., Но, как правило, с достаточной памятью, просто немного терпения. Я добавил «уникальную» во вторую строку, поскольку у нее есть потенциал для ускорения некоторых сравнений. – lmo

+0

Удивительный. Еще раз спасибо! – flightless13wings

1

Вот еще один ответ

where_dupe <- which(apply(df, 2, duplicated), arr.ind = T) 

дает вам расположение дублированных элементов в пределах вашего исходного кадра данных.

col_unique <- setdiff(1:ncol(df), where_dupe) 

дает вам столбцы не было дубликатов

Вы можете найти значения с помощью индексации.

df[,col_unique] 
Смежные вопросы