我有一个关于在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,]
我想知道的是,如果我以正确的方式处理非常大的数据集,或者已经有内置函数来执行此操作。
答案 0 :(得分:1)
我可以用[{1}}和sortme
sapply
和sort
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