apply()系関数はなかなか覚えきれないが…

  • こちらから
  • 自分の備忘録にこの日記にもメモを残しておく

# ループを減らすのはRのこつ
# apply()系の関数の使い方は内容のよくわかっているものでやってみるのが一番

# ローカスごとにアレル数を取り出す
l<-6
k<-sample(2:50,l,replace=TRUE)

# 各ローカスのアレル数が出たら、それを使って、
# 各ローカスのアレルIDのリストを作る
alist<-sapply(k,":",1)

# アレルのリストがあれば、そこから1つ取り出せばよい
# リストの要素のそれぞれに同じ処理をするには"lapply()"関数を使う

hap1<-c(as.numeric(lapply(alist,sample,1)))
hap2<-c(as.numeric(lapply(alist,sample,1)))
# 親ハプロタイプを2列に納めておく
hap12<-cbind(hap1,hap2)
# 各行について1つの値を選べば、子のアレルが取れる
# 行列型データの行についての処理はapply(hoge, 1, ...)
# 行列型データの列についての処理はapply(hoge, 2, ...)
hap<-apply(hap12,1,sample,size=1)

# 生成したものを見てみよう
alist
hap1
hap2
hap12
hap

# これを利用して、1ペアの親から1子を作るのではなく、
# 2N本のハプロタイプを作ってそれをペアにして
# N本の子ハプロタイプを作ることにする

N<-10
# 親ハプロタイプを格納
hap1toN<-matrix(0,2*N,l)

for(i in 1:(2*N)){
	hap1toN[i,]<-c(as.numeric(lapply(alist,sample,1)))
}

# (1,2),(3,4),...,(2N-1,2N)から子ハプロタイプをN本作る
hapChildren<-matrix(0,N,l)
for(i in 1:N){
	tmpParents<-hap1toN[((i-1)*2+1):(i*2),]
	hapChildren[i,]<-apply(tmpParents,2,sample,size=1)
}
# できたものを見てみる
hap1toN
hapChildren

実行例

> # 生成したものを見てみよう
> alist
[[1]]
 [1] 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20
[24] 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1

[[2]]
 [1] 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1

[[3]]
[1] 8 7 6 5 4 3 2 1

[[4]]
 [1] 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25
[24] 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2
[47]  1

[[5]]
 [1] 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4
[24]  3  2  1

[[6]]
[1] 3 2 1

> hap1
[1] 14 11  1 28 22  1
> hap2
[1] 26  1  8  7  2  3
> hap12
     hap1 hap2
[1,]   14   26
[2,]   11    1
[3,]    1    8
[4,]   28    7
[5,]   22    2
[6,]    1    3
> hap
[1] 14  1  8 28 22  1
> hap1toN
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]   18   16    5    5   22    3
 [2,]   40    7    7   47   22    3
 [3,]   18   21    7   14   15    3
 [4,]   35    7    6   30    3    1
 [5,]   35    8    3    8   10    2
 [6,]   10    5    8   21    9    1
 [7,]   19   15    1   13   21    2
 [8,]   28   14    7    9    4    1
 [9,]   22   14    6    3    2    3
[10,]    9   15    6   29   21    1
[11,]   28   12    7   29    5    3
[12,]   32   12    3    3   21    2
[13,]   20   12    1    2    1    2
[14,]   16    1    6   36   14    2
[15,]   12   20    4   40    5    1
[16,]   27    1    8   19    3    1
[17,]   16    1    5   22   22    2
[18,]   42    2    5   22   23    2
[19,]   17   17    3    3   16    1
[20,]   38   19    7    9    1    3
> hapChildren
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]   40    7    5    5   22    3
 [2,]   18   21    6   30    3    1
 [3,]   10    8    8    8   10    2
 [4,]   19   15    7    9   21    1
 [5,]    9   14    6    3    2    3
 [6,]   32   12    7   29    5    3
 [7,]   20    1    1   36   14    2
 [8,]   27    1    4   19    3    1
 [9,]   16    2    5   22   22    2
[10,]   17   17    3    3   16    1