3

我有一个关于在 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=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

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

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

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

4

2 回答 2

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
于 2012-05-12T21:09:32.600 回答
1

我可能会替换你的函数,sortme以及sapplywithsortapply

sorted <- t(apply(df[, 1:2], 1, sort))
于 2012-05-12T02:11:46.030 回答