裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ダメ出し:つまらない繰り返しをプログラムしない

2012年07月02日 | ブログラミング

幾何平均」で

AllelesId<-NULL
AllelesId[[1]]<-c("7",9,10,11,12,13,14,15,16,17,18)
AllelesId[[2]]<-c("27",28,28.2,29,30,30.2,30.3,31,31.2,32,32.2,33,33.1,33.2,34,34.2)
AllelesId[[3]]<-c("7",6,9,9.1,10,10.1,10.3,11,12,13,14,15)
AllelesId[[4]]<-c("7",8,9,10,11,12,13,14,15,16)
AllelesId[[5]]<-c("12",13,14,15,16,17,18,19,21)
AllelesId[[6]]<-c("5",6,7,8,9,9.3,10)
AllelesId[[7]]<-c("7",8,9,10,11,12,13,14,15)
AllelesId[[8]]<-c("7",8,9,10,11,12,13,14,15)
AllelesId[[9]]<-c("16",17,18,19,20,21,22,23,24,25,26,27,28)
AllelesId[[10]]<-c("9.2",10.2,11,11.2,12,12.2,13,13.2,14,14.2,15,15.2,16,16.2,17.2,18)
AllelesId[[11]]<-c("13",14,15,16,17,18,19,20,21,22)
AllelesId[[12]]<-c("7",8,9,10,11,12,13,14)
AllelesId[[13]]<-c("10",11,12,13,14,15,16,17,17.1,18,19,20,21,22,23,24,25,26,27)
AllelesId[[14]]<-c("7",8,9,10,11,12,13,14,15)
AllelesId[[15]]<-c("17",18,19,20,21,22,22.2,23,23.2,24,24.2,25,25.2,26,27,28)
などとしているけど,そもそも,15 個の要素を持つ list を作りたいなら,vector("list", 15) とすべきだし,1000 個もあったらどうするつもり? AllelesId[[1]]AllelesId[[1000]] まで書くの?

プログラムというのは,「繰り返し」をそのまま書かないで済むようにすべき。だれも,1から1000までの和をとるときに 1+2+3+…+1000 なんて書かないでしょ?それと同じ。

以下のように書けばよいだけ。

AllelesId2 <- list(c("7",9,10,11,12,13,14,15,16,17,18),
c("27",28,28.2,29,30,30.2,30.3,31,31.2,32,32.2,33,33.1,33.2,34,34.2),
c("7",6,9,9.1,10,10.1,10.3,11,12,13,14,15),
c("7",8,9,10,11,12,13,14,15,16),
c("12",13,14,15,16,17,18,19,21),
c("5",6,7,8,9,9.3,10),
c("7",8,9,10,11,12,13,14,15),
c("7",8,9,10,11,12,13,14,15),
c("16",17,18,19,20,21,22,23,24,25,26,27,28),
c("9.2",10.2,11,11.2,12,12.2,13,13.2,14,14.2,15,15.2,16,16.2,17.2,18),
c("13",14,15,16,17,18,19,20,21,22),
c("7",8,9,10,11,12,13,14),
c("10",11,12,13,14,15,16,17,17.1,18,19,20,21,22,23,24,25,26,27),
c("7",8,9,10,11,12,13,14,15),
c("17",18,19,20,21,22,22.2,23,23.2,24,24.2,25,25.2,26,27,28))

なぜ,第1要素だけ文字列にしているのかな?全部文字列にするために全てに " " を付けるのをきらったからでしょう。

これで同じものができたかどうかは,identical 関数で調べれば分かる。

> identical(AllelesId, AllelesId2)
[1] TRUE

「完全に同じだ」ということがわかる。

ついでだからだけど,なぜ,以下のように書かないのかはわからない。単にテストデータだからか?だったらこそ,簡潔に書きたいと思うのでは?

AllelesId3 <- list(c("7",9,10,11,12,13,14,15,16,17,18),
c("27",28,28.2,29,30,30.2,30.3,31,31.2,32,32.2,33,33.1,33.2,34,34.2),
c("7",6,9,9.1,10,10.1,10.3,11,12,13,14,15),
c("7",8:16),
c("12",13:19,21),
c("5",6:9,9.3,10),
c("7",8:15),
c("7",8:15),
c("16",17:28),
c("9.2",10.2,11,11.2,12,12.2,13,13.2,14,14.2,15,15.2,16,16.2,17.2,18),
c("13",14:22),
c("7",8:14),
c("10",11:17,17.1,18:27),
c("7",8:15),
c("17",18:22,22.2,23,23.2,24,24.2,25,25.2,26:28))

当然だが,これも,最初の書き方でできるものと完全に同じだ。

> identical(AllelesId, AllelesId3)
[1] TRUE

ちなみに,【幾何平均をもって、「代表値」とすることの意義はあるのか、あるとしたらどのあたりにあるのか…はまだ不明】ということの真意はよく分からないけど,対数正規分布の代表値は幾何平均だよね。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村