カウントデータの {0, 1} 変換問題とはこういうものだ.
いま,
例題として使用するために,
てきとーに data
という名前の data.frame をでっちあげる.
> (data <- data.frame(id = 1:4, n.sample = 5,
x = c(2, 5, 3, 4), y = c("red", "yellow", "green", "blue")))
id n.sample x y
1 1 5 2 red
2 2 5 5 yellow
3 3 5 3 green
4 4 5 4 blue
各行は「5 sample のうち x 個が『応答』しました」
といった二項分布モデルを使って解析したくなるデータセット,
と考えてほしい.
x
以外の列は無意味なでたらめ.
ただし id
列はあとで重要になる.
これの {0, 1} 変換とはこういうことで,
もともと 4 行だった data.frame を 20 行の data.frame になおすことである.
id x n.sample y
1 1 1 5 red
2 1 1 5 red
3 1 0 5 red
4 1 0 5 red
5 1 0 5 red
6 2 1 5 yellow
7 2 1 5 yellow
8 2 1 5 yellow
9 2 1 5 yellow
10 2 1 5 yellow
11 3 1 5 green
12 3 1 5 green
13 3 1 5 green
14 3 0 5 green
15 3 0 5 green
16 4 1 5 blue
17 4 1 5 blue
18 4 1 5 blue
19 4 1 5 blue
20 4 0 5 blue
さて,
これを簡単にやるにはどうしたらよいか,
というまあ
R
の data.frame 操作練習,
みたいに考えるか.
手順は
-
x
という列名の列を {0, 1} 展開して横に
ID となる列をくっつけ
-
それに他のデータを
merge()
する
(ID にあわせて結合)
という趣向だ.
コードはたとえばこうなる.
# data という名の data.frame を {0, 1} 展開する
n.repeat <- 5 # 展開する回数
colname.expand <- "x" # 展開する列名
colname.id <- "id" # merge でくっつけるときの id 列名
colnames.others <- colnames(data)
colnames.others <- colnames.others[ # colname.id 列を含む
colnames.others != colname.expand
]
converted01 <- data.frame( # id つき {0, 1} の長い data.frame
c(sapply(
data[, colname.expand],
function(x) c(rep(1, x), rep(0, n.repeat - x))
)),
c(sapply(data[, colname.id], function(x) rep(x, n.repeat)))
)
names(converted01) <- c(colname.expand, colname.id) # 列名をつけて
converted <- merge(converted01, data[, colnames.others], by = colname.id)
print(converted)