gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:19:21 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com