No.10559 任意の行を削除する方法  【波音】 2009/08/01(Sat) 01:47

行列の操作について,

> tori
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0.3198326 0.73944038 0.62683344 0.3325382 -0.16990250 -0.03080267
[2,] -0.2302428 0.26248794 -0.05346480 1.0677622 0.13461262 0.32153800
[3,] 0.5374416 0.66305214 0.44875782 0.1022781 -0.15181106 0.08558139
[4,] 0.6855395 0.04026808 0.29809229 0.3574382 0.40554393 0.75254222
[5,] 0.2903546 0.56963315 0.56031690 0.5875126 -0.03837398 0.39822703
[6,] 0.4569031 0.01956944 0.42089326 0.5235664 0.51556428 0.52027481
[7,] 0.2353117 0.80461076 0.49913885 0.1821366 -0.39960913 0.15727250
[8,] -0.2162918 0.26917714 -0.06854486 1.0799826 0.03586894 0.34947568
[9,] 0.3126457 -0.15790953 0.13156716 0.6420470 0.79753128 0.49902651
[10,] 0.3787011 -0.18708944 0.25025536 0.5140577 0.71099728 0.66578830

という行列から,1以上の値が含まれている行を削除する(逆にいえば1以上の値が含まれない行のみを取り出す)ということはできるのでしょうか。

No.10560 Re: 任意の行を削除する方法  【青木繁伸】 2009/08/01(Sat) 09:08

いろいろあるでしょうが,取りあえず簡単バージョンを 4 つほど。
(x <- round(matrix(rnorm(60), 10), 3))
x[x[cbind(1:nrow(x), max.col(x))] < 1,]
x[apply(x, 1, function(x) !any(x >= 1)),]
x[apply(x, 1, function(x) all(x < 1)),]
split(data.frame(x), apply(x, 1, function(x) all(x < 1)))[[2]]

No.10561 Re: 任意の行を削除する方法  【波音】 2009/08/01(Sat) 13:38

回答ありがとうございます。

なるほど,apply()の適用する関数を指定するところで,any()やall()を利用して条件の合う行だけを抜き出すような関数を使えばよかったのですね。データフレームにして,split()を使うやり方もあったのですね。勉強になりました。

● 「統計学関連なんでもあり」の過去ログ--- 042 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る