No.22162 R 論理ベクトルの論理和の計算  【明石】 2016/10/04(Tue) 09:47

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

昨日は,「"を含む文字列の連結」について,色々な方法をご教示いただき,
誠にありがとうございました。

とても良い勉強になりました。
御礼を申し上げます。

Rプログラムについて,ご教示いただきたいことが出てきました。

私も自分で動くプログラムは作成できましたが,
より良い方法を知りたくて,投稿させていただきました。

どうぞよろしくお願いします。

-----------------------------------------------------

以下のような,論理値からなる行列(m行 n列)があります。

論理ベクトルは列ベクトル(縦ベクトル)で,m,nの意味は以下のとおりです。
m; 論理ベクトルの要素の個数
n; 論理ベクトルの本数

お示しをしました例では,m=30,n=10 です。
この行列の名前を mx とします。
> mx
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[4,] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[7,] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[8,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[10,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[11,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13,] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
[14,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[15,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[16,] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
[17,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[18,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[19,] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
[20,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[21,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[22,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
[23,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[24,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[25,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
[26,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[27,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[28,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
[29,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[30,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
n本の論理ベクトルの論理和を求めます。

お示しをしました例では,m=30,n=10と小さい値ですが,
実際には,m,nの値はとても大きい値ですので,
n本の論理ベクトルの論理和を効率的に計算する方法を知りたいと思います。

私は,以下のように考えました。

・まず,論理値を,0/1の2値に変換して,
 (過去の投稿で,青木先生からご教示いただきました有用な方法です)
・次に,行列の横計を求めて,
・横計が1以上ならば,1に置き換えて,
・最後に,2値化された横計を,論理値に戻す
mx <- mx + 0

rs <- rowSums(mx)

test<- (rs > 1)
rs[test] <- 1
rs <- as.logical(rs)
rs が,n本の論理ベクトルの論理和で,求めるものです。

より良い方法があると思いますので,ご教示をいただければ大変に助かります。
どうぞ,よろしくお願いします。

いつもありがとうございます。

No.22163 Re: R 論理ベクトルの論理和の計算  【青木繁伸】 2016/10/04(Tue) 15:07

示されたプログラムで十分です。

ただいくつか無駄がありますので,無駄を省くと以下のようになります
rs <- rowSums(mx)
rs <- rs >= 1
すなわち,logical についての数値演算の際の変換は自動的に行われるので mx <- mx + 0 は不要です。
また, rs >= 1 とすれば結果は logical なので,rs <- rs >= 1 で最終的な結果が得られます。

一行でやるなら rowSums(mx) >= 1 で,記述も簡潔になります。

No.22164 【御礼】 Re: R 論理ベクトルの論理和の計算  【明石】 2016/10/04(Tue) 17:14

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

今回も有難いご教示をいただき,大変に勉強になりました。
心から御礼を申し上げます。

ありがとうございました。

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