在R中对元组进行排序后删除重复的元组

时间:2012-05-12 01:45:17

标签: r duplicates tuples

我有一个关于在R中的元组内排序后删除重复的问题。

假设我有一个值数据框

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和b

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 vs 5,2 vs 6等,但5 vs 1与1 vs 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

然后我还使用!duplicated来获取我可以在原始数据集中使用的真/假结果列表,以从另一个单独的列中提取值。

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

我想知道的是,如果我以正确的方式处理非常大的数据集,或者已经有内置函数来执行此操作。

2 个答案:

答案 0 :(得分:1)

我可以用[{1}}和sortme

替换您的函数sapplysort
apply

答案 1 :(得分: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