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

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

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

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

ループ

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

Q&A

解決済

2回答

837閲覧

RのFor loopで文字列上の"i"をループに組み込みたい

Sota_KATO

総合スコア1

R

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

ループ

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

0グッド

0クリップ

投稿2021/06/30 00:50

前提・実現したいこと

Rのfor loopについて質問があります。

例えば、このような4つのコードをfor loopで簡略化したいです。

c1 <- tajima.test(data_snps[cluster1_acc,]) c2 <- tajima.test(data_snps[cluster2_acc,]) c3 <- tajima.test(data_snps[cluster3_acc,]) c4 <- tajima.test(data_snps[cluster4_acc,])

一旦このようにしてループを書いてみました。

for (i in 1:4){ ci <- tajima.test(data_snps[cluteri_acc,])}

しかし、"i"はデータフレーム名として認識されてループに組み込むことが出来ません。
このように、文字の上にあるiをloopのものと認識させる方法はあるのでしょうか?

clusterX_accにはいくつかの数値 (e.g. 1, 3, 5) が入っています。

試したこと

paste0を使用して、clusterX_accの部分を

test <- paste0("cluster",i,"_acc") c1 <- tajima.test(data_snps[test,])

のように無理やり組み込んでも、testはあくまで"clster1_acc"という文字列のため、このデータフレームが持っている数字の情報は引続ことが出来ません。

他の関数も試してみましたが、どれもうまくいきませんでした…
なにか()や[]などの記号を使って"i"をループに組み込むことは出来るのでしょうか。

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

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

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

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

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

guest

回答2

0

変数名を動的に扱うことは諦めました。y_waiwaiさんのアドバイス通り、データを1つのフレームに集めてインデックスを動的にして抽出する方法を選びました。

さらに、列数がデータごとに異なる問題も、あえて多めにlengthを取ってNAを含ませることで列数を統一して、cbindでデータを合体させる方法を思いつきました。

最終的なコードは次のようになります。

for(i in 1:best){ indv <- c(df[df$cluster==i,]$individual]) length(indv) = 10 cluster_indv <- cbind(cluster_indv,indv) }

質問内容に書いたコードよりも上流にある部分を改善した形です。

投稿2021/06/30 02:03

Sota_KATO

総合スコア1

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

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

0

ベストアンサー

初心者の方の変数名を動的に変えたい、という質問が多いですが、
これはできません、ってかしないほうがいいです。

あっさり配列かリストにして実装し、インデックスでループ回しましょう

#pythonなんかのインタプリタ系言語ではできんこともない、ですが、それでも推奨はされません

投稿2021/06/30 01:05

編集2021/06/30 01:12
y_waiwai

総合スコア87719

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

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

Sota_KATO

2021/06/30 01:19 編集

早速のご返信ありがとうございます。 なるほど… データをリストにしてしまえばlist[i]といった感じで使えますね! リストのためのコードを書いてみました。 ``` best <- which.min(test) # bestは集団の数で、コードを走らせるごとに異なってしまいます for(i in 1:best){ cluster <- list(cluster, df[df$name==i,]) } ``` しかし、ループを重ねるごとに、リスト内の番号が[1][1][1][2]といった分かりづらい表記になってしまいます。これを対策することは可能でしょうか?
Sota_KATO

2021/06/30 02:00

それぞれのデータフレームごとにデータの数が異なるのでListに執着していましたが、NAをあえて含ませることで列数を揃えてcbindをする方法を思いつきました!!おかげで欲しい結果を得ることが出来ました。 y_waiwaiさんのアドバイスがなかったらもっと悩んでいたと思います。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問