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

标签 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 对 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,]

我想知道的是,对于一个非常大的数据集,我是否以正确的方式进行此操作,或者是否已经有一个内置函数可以执行此操作。

最佳答案

根据您所说的“非常大的数据集”的含义,您可以通过仅将排序函数应用于总和重复的那些行来提高速度。

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

关于在 R 中对元组进行排序后删除重复的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10560395/

相关文章:

r - 优化列表函数以避免 R 中的循环

r - 将 UI 插入 R Shiny 模块服务器

tree - ANTLR 复制一棵树

typescript - 控制流不使用联合元组进行类型缩小?

scala - 如何将两个元组与兼容的类型结合起来?

c++ - 为什么 C++ 元组如此奇怪?

r - 我怎样才能用 RandomIcon() 在我 Shiny 的盒子里制作一张 table

r - 将笛卡尔角转换为 R 中的极角/罗盘角/基数角?

mysql - 通过在 sql 中使用两列从表中删除重复项?

javascript - ng-repeat 在项目更改时重复