11/22 プログラミングセミナー その2からの続き。
バグ取りはまだしていない。
# とりあえず変数を置いとく。 Nbase<- 2 Nbatter<- 5 # ここの値は11/22の表から選ぶ。 Nout<- 2 #Bprob<- c(0.7,0.1,0.1,0.05,0.05) Bprob<- c(0.8,0.05,0.05,0.05,0.05)
# 考えられる打撃パターンをすべて発生させる。 p<- a<- list(0:Nbase) for(i in 1:(Nbatter - 1)){ p<- c(p,a) } res<- expand.grid(p) dim(res) # Nbase^NbatterならOK。
# resのなかで、Nout回アウトが出ていないものを排除する。 out.omitter<- function(vector){ # 変数はベクトル。 if(length(vector[vector == 0]) < Nout){ vector<- rep(NA,length(vector)) } return(vector) }
# ここはちょっとやっかい。listだったりmatrixだったりして扱いに困る。がちゃがちゃ変換中。 A<- matrix(unlist(res),nrow(res),ncol(res)) # listを強引にmatrix化。 B<- apply(A,1,out.omitter) # Bはなぜか行と列が入れ替わってるっぽい。 C<- na.omit(t(B)) # だから転置するはめに。 D<- C[c(1:nrow(C)),c(1:ncol(C))] # na.omitは後ろに変な子がついてくるので要らない。
# Dの中で重複する配列がある。それらを排除しにかかる。 vec0<- function(Mat){ M<- mapply(rep,NA,Nout:Nbatter) # mapplyは難しい。 for(y in 1:nrow(Mat)){ count0<- 0 nector0<- c() for(r in 1:ncol(Mat)){ if(Mat[y,r] == 0){ count0<- count0 + 1 } if(count0 == Nout){ vector0<- Mat[y,c(1:r)] break } } M[[length(vector0)-Nout+1]]<- rbind(M[[length(vector0)-Nout+1]],vector0) } return(M) }
# M<- mapply(rep,NA,Nout:Nbatter)のNAを排除しにかかる。 NA.omit<- function(Mat){ return(na.omit(Mat)[c(1:nrow(na.omit(Mat))),c(1:ncol(na.omit(Mat)))]) }
# さあがんばれ。 E<- vec0(D) F<- lapply(E,NA.omit) G<- lapply(F,unique) # uniqueで重複したものが統一される。ベクトルにも使える。
# これと同じ。 lapply(lapply(vec0(D),NA.omit),unique)
ここまで。これ以降は
# 打撃確率をがちゃがちゃかけていってるだけ。 score.probability<- function(seq){ runner<- rep(0,Nbase) runner.prob<- 1 out<- 0 for(k in 1:length(seq)){ if(!seq[k] == 0){ runner<- c(runner,c(1,rep(0,(seq[k] - 1)))) runner.prob<- runner.prob*Bprob[seq[k]+1] }else{ runner.prob<- runner.prob*Bprob[seq[k]+1] out<- out + 1 } if(out == Nout){ break } } runner<- runner[1:(length(runner) - (Nbase - 1))] #runner<- runner[-c((length(seq) - Nbase + 1):length(seq))] return(list(sum(runner),runner.prob)) }
# 得点に対する確率的なやつ。 Result<- function(Matrix){ Score<- 0:max(Matrix[1,]) Probability<- rep(0,length(Score)) for(t in 0:max(Matrix[1,])){ Probability[t+1]<- sum(Matrix[2,which(F[1,]==t)]) } return(Probability) }
ABCDのところ
D<- na.omit(t(apply(res,1,out.omitter))) D<- D[c(1:nrow(D)),c(1:ncol(D))]
と書ける。