2014-01-14 13 views
1

Я пытаюсь идентифицировать дубликаты на основе соответствия элементов в двух векторах. Использование duplicate() предоставляет вектор всех совпадений, однако я хотел бы индексировать совпадения друг с другом или нет. Используя следующий код в качестве примера:Идентификация уникальных дубликатов в векторе в R

x <- c(1,6,4,6,4,4)    
y <- c(3,2,5,2,5,5)   

frame <- data.frame(x,y)   
matches <- duplicated(frame) | duplicated(frame, fromLast = TRUE) 
matches 
[1] FALSE TRUE TRUE TRUE TRUE TRUE 

В конечном счете, я хотел бы создать вектор, который идентифицирует элементы 2 и 4 матчей, а также 3,5,6. Любые мысли приветствуются.

+1

Пожалуйста, разместите пример того, как должен выглядеть вектор. Как вы хотите определить, соответствуют ли элементы 2 и 4? Давая им такую ​​же ценность? –

ответ

1

Как об этом с plyr::ddply()

ddply(cbind(index=1:nrow(frame),frame),.(x,y),summarise,count=length(index),elems=paste0(index,collapse=",")) 

    x y count elems 
1 1 3  1  1 
2 4 5  3 3,5,6 
3 6 2  2 2,4 

NB = выражение cbind(index=1:nrow(frame),frame) просто добавляет индекс элемента к каждой строке

1

Использование merge против unique возможностей для каждой строки, вы можете получить результат:

labls <- data.frame(unique(frame),num=1:nrow(unique(frame))) 
result <- merge(transform(frame,row = 1:nrow(frame)),labls,by=c("x","y")) 
result[order(result$row),] 

# x y row num 
#1 1 3 1 1 
#5 6 2 2 2 
#2 4 5 3 3 
#6 6 2 4 2 
#3 4 5 5 3 
#4 4 5 6 3 

result$num вектор дает группы.

4

Другой data.table ответ, используя счетчик группы .GRP назначить каждый отдельный элемент метки:

d <- data.table(frame) 
d[,z := .GRP, by = list(x,y)] 
# x y z 
# 1: 1 3 1 
# 2: 6 2 2 
# 3: 4 5 3 
# 4: 6 2 2 
# 5: 4 5 3 
# 6: 4 5 3 
+0

Тот же результат, что и у меня, но с гораздо большей эффективностью, используя 'data.table'! – thelatemail

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