データフレームの例を考えると:
a <- c(1:3,4:6)
b <- c(2:4,3,2,1)
c <- cbind(a,b)
同様の比較で行を削除してデータフレームをサブセット化し(例:row3:3,4はrow4:4,3と同じ)、そのうちの1つだけを持ちたいと思います。
a <- c(1:3,4:6)
b <- c(2:4,3,2,1)
d <- cbind(a,b)
e <- t(apply(d,1,function(x){x[order(x)]}))
d <- d[!duplicated(e),]
> d
a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
[4,] 5 2
[5,] 6 1
d
ではなく、あなたのマトリックスであると仮定しますc
:
e <- unique(apply(d,1,function(x) paste(sort(x),collapse="~")))
> t(sapply(strsplit(e,"~"),as.numeric))
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 3 4
[4,] 2 5
[5,] 1 6
それを分解する:
最初の行
apply(d,1,function(x) ... )
d の各行を取得し、ここx
で本体を呼び出した無名関数にベクトルとして渡し...
ます。
関数本体はpaste(sort(x),collapse="~")
で、ベクトルを並べ替えてから、各要素が で区切られた長さ 1 のベクトルに変換し~
ます。
したがって、apply
全体的な呼び出しは、各要素が行列の行であった文字ベクトルを返します。
次にunique
、一意の要素のみを保持します。並べ替えにより、これが意図したとおりに行われることが保証されます。
二行目
strsplit(e,"~")
文字ベクトルを別の形式に分割します。この場合、各要素が各行を構成する数値の文字ベクトルであるリストです。
sapply(...,as.numeric)
as.numeric()
リストの各要素に適用されます。そのため、文字ベクトルを数値ベクトルに変換します。s
insapply
は「単純化」を表すため、これからマトリックスを作成します。
しかし、それは間違った方向です (5x2 ではなく 2x5)! t()
行列を元の形式に転置します。
あなたの例では、 c は data.frame ではなく、マトリックスです。他の人が述べているように、 c を変数名として使用しないでください。
1行で、次のことができます:
a <- c(1:3,4:6)
b <- c(2:4,3,2,1)
cc <- cbind(a,b)
cc[!duplicated(t(apply(cc,1,sort))), ]
a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
[4,] 5 2
[5,] 6 1