データはたとえばこうでっちあげてみよう.
今回は n.sample
はふぞろい,
という状況
(前回は n.sample = 5
と固定).
> (data <- data.frame(id = 1:4, n.sample = c(4, 3, 5, 5),
x = c(2, 1, 3, 4), y = c("red", "yellow", "green", "blue")))
id n.sample x y
1 1 4 2 red
2 2 3 1 yellow
3 3 5 3 green
4 4 5 4 blue
まず,
こいつを n.sample
の回数ぶんだけ
タテにのばす.
この「のばし」わざ!
> (Data <- data[rep(1:nrow(data), data$n.sample),])
id n.sample x y
1 1 4 2 red
1.1 1 4 2 red
1.2 1 4 2 red
1.3 1 4 2 red
2 2 3 1 yellow
2.1 2 3 1 yellow
2.2 2 3 1 yellow
3 3 5 3 green
3.1 3 5 3 green
3.2 3 5 3 green
3.3 3 5 3 green
3.4 3 5 3 green
4 4 5 4 blue
4.1 4 5 4 blue
4.2 4 5 4 blue
4.3 4 5 4 blue
4.4 4 5 4 blue
つぎに x
列を {0, 1} におきかえる.
mapply()
を使う.
mapply()
の使いどころとはこういうところだったのか
……
> Data$x <- ifelse(unlist(mapply(seq, data$x, 1+data$x -data$n.sample)) > 0, 1, 0)
> Data
id n.sample x y
1 1 4 1 red
1.1 1 4 1 red
1.2 1 4 0 red
1.3 1 4 0 red
2 2 3 1 yellow
2.1 2 3 0 yellow
2.2 2 3 0 yellow
3 3 5 1 green
3.1 3 5 1 green
3.2 3 5 1 green
3.3 3 5 0 green
3.4 3 5 0 green
4 4 5 1 blue
4.1 4 5 1 blue
4.2 4 5 1 blue
4.3 4 5 1 blue
4.4 4 5 0 blue
さて,
ここでなぜこのように「手品」のごとく {0, 1}
変換ができるのか説明してみよう.
まず
mapply()
部分だけを動かしてみると
> mapply(seq, data$x, 1+data$x -data$n.sample)
[[1]]
[1] 2 1 0 -1
[[2]]
[1] 1 0 -1
[[3]]
[1] 3 2 1 0 -1
[[4]]
[1] 4 3 2 1 0
このような整数 vector の list になっていることがわかる.
unlist()
すると
> unlist(mapply(seq, data$x, 1+data$x -data$n.sample))
[1] 2 1 0 -1 1 0 -1 3 2 1 0 -1 4 3 2 1 0
全部くっついた vector になり,
さらに不等式にわたすと
> unlist(mapply(seq, data$x, 1+data$x -data$n.sample)) > 0
[1] TRUE TRUE FALSE FALSE TRUE FALSE FALSE TRUE TRUE TRUE FALSE FALSE TRUE TRUE
[15] TRUE TRUE FALSE
logical 型 ({TRUE, FALSE}
)
vector になるので ifelse(..., 1, 0)
すれば {0, 1} 変換できる.