質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

2回答

7124閲覧

多重ループの書き方(R言語)

nanami23

総合スコア12

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2018/11/10 22:40

編集2018/11/10 22:43

お世話になります。

以下のような多重ループ文を、別の方法で(Rっぽく)書くことはできないでしょうか。

for (i in 1:3) { for (j in seq(11,15,2)) { for (k in seq(101,110,3)) { print(paste(paste(i,j),k)) } } }

よろしくお願いします。
nanami

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

1:3seq(11,15,2)seq(101,110,3)) の組み合わせは expand.grid()で得ることが出来ますので、あとは apply() にて関数適用を行い、print(paste()) を実行すると良いのではないでしょうか

R

1func <- function(x) print(paste(x[1],x[2],x[3])) 2r = apply(expand.grid(1:3, seq(11,15,2), seq(101,110,3)), 1, func)

投稿2018/11/11 05:04

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanami23

2018/11/11 09:55

magichanさん 回答ありがとうございます。 コンパクトなコード参考になりました。 ベストアンサーにさせていただきます。
guest

0

apply系関数を使うのは常道ですね。

sapply( seq(1:3), function(i){ sapply( seq(11,15,2), function(j){ sapply(seq(101,110,3), function(k){print(paste(i,j,k))}) }) })

ただ、中身が複雑になってくると、みにくくはなります。
よほどスピードが求められるのでない限り、素直にforループを使ったほうがいいと思います。

#速度について
「よほどスピードが求められるのでない限り」とか何となく書いてしまいましたが、実際のところ実行時間に差が出るものか試してみました。
質問文にある程度の組み合わせ量ではどのみち差が出ないので、ループ回数をふやしての実験です。

Rprof(tmp<-tempfile(), interval=0.01) #ii <- 1:3000 #jj <- seq(11,15,2) #kk <- seq(101,110,3) ii <- 1:100 jj <- 1:100 kk <- 1:100 func1 <- function(){ for (i in ii) { for (j in jj) { for (k in kk) { # print(paste(paste(i,j),k)) } } } } func2 <- function(){ sapply(ii, function(i){ sapply(jj, function(j){ sapply(kk, function(k){ # print(paste(i,j,k)) }) }) }) return(invisible()) } func3 <- function(){ apply(expand.grid(ii, jj, kk), 1, function(x){ # print(paste(x[1],x[2],x[3])) }) return(invisible()) } func1() func2() func3() Rprof(NULL) profres <- summaryRprof(tmp) print(profres$by.total[grep("func[1-3]", rownames(profres$by.total)),])

結果は次の通り。

> source("test.r") total.time total.pct self.time self.pct "func3" 3.59 62.87 0.00 0.00 "func2" 2.06 36.08 0.00 0.00 "func1" 0.06 1.05 0.06 1.05

なんとforループがダントツでした。expand.gridではいったんすべての組み合わせをリストアップしたリストを作るため、そのオーバーヘッドが生じていると想像されます。

投稿2018/11/11 04:41

編集2018/11/11 10:30
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanami23

2018/11/11 09:52

KojiDoiさん 回答ありがとうございます。 可読性のアドバイス参考になりました。
nanami23

2018/11/11 11:31

KojiDoiさん 速度について、追加の情報ありがとうございました。 Rではforループは使わない方がよいものだと思い込んでいたので大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問