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

a=df[,1]
b=df[,2]
temp<-cbind(a,b)

私がしているのは、ソートされたタプルに基づいたユニーク化です。たとえば、エントリa[5]とb[5]を削除して、a=1,2,7,8,1とb=5,6,3,4,8を維持したいとします。これは基本的に、2つのオブジェクト間の相互作用を決定するためのものです。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を使用して、元のデータセットで使用できるtrue / falseの結果のリストを取得し、別の別の列から値を引き出します。

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そしてsapplysortapply

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