0

データフレームの例を考えると:

a <- c(1:3,4:6)
b <- c(2:4,3,2,1)
c <- cbind(a,b)

同様の比較で行を削除してデータフレームをサブセット化し(例:row3:3,4はrow4:4,3と同じ)、そのうちの1つだけを持ちたいと思います。

4

3 に答える 3

3
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
于 2013-09-19T21:05:45.193 に答える
2

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()リストの各要素に適用されます。そのため、文字ベクトルを数値ベクトルに変換します。sinsapplyは「単純化」を表すため、これからマトリックスを作成します。

しかし、それは間違った方向です (5x2 ではなく 2x5)! t()行列を元の形式に転置します。

于 2013-09-19T21:01:46.783 に答える
1

あなたの例では、 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
于 2013-09-19T21:22:17.233 に答える