2012-05-12 2 views
3

У меня есть вопрос, касающийся удаления дубликатов после сортировки в кортеже в R.Удалить дубликаты кортежей после сортировки кортеж в R

Скажем, у меня есть dataframe значений

df<-cbind(c(1,2,7,8,5,1),c(5,6,3,4,1,8),c(1.2,1,-.5,5,1.2,1)) 

а и б

a=df[,1] 
b=df[,2] 
temp<-cbind(a,b) 

То, что я делаю, является уникальным на основе отсортированного кортежа. Например, я хочу сохранить a = 1,2,7,8,1 и b = 5,6,3,4,8 с удаленной записью a [5] и b [5]. Это в основном для определения взаимодействия между двумя объектами. 1 против 5, 2 против 6 и т. Д., Но 5 против 1 совпадает с 1 против 5, поэтому я хочу удалить его.

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

sortme<-function(i){sort(temp[i,])} 
sorted<-t(sapply(1:nrow(temp),sortme)) 

и получили следующие результаты

 a b 
[1,] 1 5 
[2,] 2 6 
[3,] 3 7 
[4,] 4 8 
[5,] 1 5 
[6,] 1 8 

Я тогда уникальный отсортированном результата

unique(sorted) 

который дает

 a b 
[1,] 1 5 
[2,] 2 6 
[3,] 3 7 
[4,] 4 8 
[5,] 1 8 

я затем использовать! Дублируется, чтобы получить список истинных/ложных результатов, которые я могу используйте в моем исходном наборе данных, чтобы вытащить значения из другого отдельного столбца.

T_F<-!duplicated(sorted) 
final_df<-df[T_F,] 

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

ответ

1

В зависимости от того, что вы подразумеваете под «очень большим набором данных», вы можете получить некоторую скорость, применяя функцию сортировки только те строки, суммы которых дублируются.

theSums<-.rowSums(temp,m=nrow(temp),n=ncol(temp)) 

almostSorted <- do.call(rbind, tapply(seq_len(nrow(temp)), theSums, 
    function(x) { 
    if(length(x) == 1L) { 
     return(cbind(x, temp[x, , drop = FALSE])) 
    } else { 
     return(cbind(x, t(apply(temp[x, ], 1, sort)))) 
    } 
    } 
)) 

(sorted <- almostSorted[order(almostSorted[, 1]), -1]) 

[1,] 1 5 
[2,] 2 6 
[3,] 7 3 
[4,] 8 4 
[5,] 1 5 
[6,] 1 8 
+0

Благодарю вас. Я не думал об этом. – doggysaywhat

1

Я мог бы заменить функцию, sortme и sapply с sort и apply

sorted <- t(apply(df[, 1:2], 1, sort)) 
Смежные вопросы