0

私が持っているデータは次のようなものです:

RES1 <- c("A","B","A","A","B")
RES2 <- c("B","A","A","B","A")
VAL1 <-c(3,5,3,6,8)
VAL2 <- c(5,3,7,2,7)
dff <- data.frame(RES1,VAL1,RES2,VAL2)
dff
  RES1 VAL1 RES2 VAL2
  1    A    3    B    5 
  2    B    5    A    3
  3    A    3    A    7
  4    A    6    B    2
  5    B    8    A    7

同じ res1-res2 ペアが既にある行を削除したいと思います。例: A 3 は B 5 と相互作用します。それが私が欲しい情報です。どのペアが最初かは気にしません。B 5 with A 3 または A 3 with B 5.取得したいのは、次のデータフレームです。

output
  RES1 VAL1 RES2 VAL2
   1    A    3    B    5
   2    A    3    A    7
   3    A    6    B    2
   4    B    8    A    7

次に、次のような別のデータフレームに対して同じことをしたい:

RES3 <- c("B","B","B","A","B")
RES4 <- c("A","A","A","A","B")
VAL4 <- c(3,7,5,3,8)
VAL3 <- c(5,8,3,7,3)
df2 <- data.frame(RES3,VAL3,RES4,VAL4)

df2
  RES3 VAL3 RES4 VAL4
   1     B     5     A     3
   2     B     8     A     7
   3     B     3     A     5
   4     A     7     A     3
   5     B     3     B     8

最後に、相互のペアを維持したいだけです (私の定義では、両方のペアは同じです。一方を維持することが不可欠です。「A 5」-「B 3」は「B 3」-「A 5」と同じです。つまり、順序は関係ありません。

私が望む最終出力には、一意であり、両方のデータフレームに存在する次のペアが必要です。

mutualpairs
  RESA VALA RESB VALB
  A     3     B     5
  A     3     A     7
  B     8     A     7
4

2 に答える 2

4

次のコードを使用できます。

dff[!duplicated(t(apply(cbind(paste(dff$RES1,dff$VAL1),paste(dff$RES2,dff$VAL2)),1,sort))),]

同等の展開コード:

v1 <- paste(dff$RES1,dff$VAL1)
v2 <- paste(dff$RES2,dff$VAL2)
mx <- cbind(v1,v2)
mxSorted <- t(apply(mx,1,sort))
duped <- duplicated(mxSorted)
dff[!duped,]

説明:

1)列 RES1-VAL1 と RES2-VAL2 を連結して 2 つの文字ベクトルを作成しますv1(デフォルトの区切り文字としてスペースを使用することに注意してください。安全のために別の文字または文字列を使用することもできます (例: 、など ...)。 結果:v2paste|@;

> v1
[1] "A 3" "B 5" "A 3" "A 6" "B 8"
> v2
[1] "B 5" "A 3" "A 7" "B 2" "A 7"

2) これら 2 つのベクトルをバインドして、 を使用して行列を形成しcbindます。
結果:

     [,1]  [,2] 
[1,] "A 3" "B 5"
[2,] "B 5" "A 3"
[3,] "A 3" "A 7"
[4,] "A 6" "B 2"
[5,] "B 8" "A 7"

3) を使用して行列の各行の値を並べ替えますt(apply(mx,1,sort))
行をソートすることにより、スワップされた同じ値を持つ行を同一にするだけです (apply関数は常に列の結果を返すため、最終的な転置が必要であることに注意してください)。
結果:

     [,1]  [,2] 
[1,] "A 3" "B 5"
[2,] "A 3" "B 5"
[3,] "A 3" "A 7"
[4,] "A 6" "B 2"
[5,] "A 7" "B 8"

4)duplicated行列を呼び出すと、長さ = nrow(matrix) の論理ベクトルが得られます。これは、行が前の行の複製である場合に TRUE になるため、この場合は次のようになります。

[1] FALSE  TRUE FALSE FALSE FALSE
# i.e. the second row is a duplicate

5) 最後に、このベクトルを使用して data.frame の行をフィルタリングし、最終結果を取得します。

  RES1 VAL1 RES2 VAL2
1    A    3    B    5
3    A    3    A    7
4    A    6    B    2
5    B    8    A    7
于 2016-04-22T20:38:19.017 に答える
0

Rのデータフレームから重複する列の組み合わせを削除するの重複の可能性

ここで答えを適応させる:

dff[!duplicated(dff[c('RES1','RES2')]),]
于 2016-04-22T19:41:48.650 に答える