Опираясь на ответ @ Джея, мы имеем это в качестве логической матрицы.
Версия логической матрицы:
out <- model.matrix( ~ V1 - 1, data=dat)
out <- matrix(as.logical(out), ncol = ncol(out))
colnames(out) <- with(dat, levels(V1))
> out
bg cv xc
[1,] FALSE FALSE TRUE
[2,] FALSE FALSE TRUE
[3,] FALSE FALSE TRUE
[4,] FALSE TRUE FALSE
[5,] TRUE FALSE FALSE
[6,] TRUE FALSE FALSE
Все переменные одновременно версия:
out2 <- sapply(dat, function(x) model.matrix( ~ x - 1))
out2 <- do.call(cbind, out2)
out2 <- matrix(as.logical(out2), ncol = ncol(out2))
colnames(out2) <- unlist(sapply(dat, levels))
> out2
bg cv xc ab yi yt yu tf tg ty
[1,] FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE
[2,] FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE
[3,] FALSE FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE
[4,] FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE
[5,] TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE
[6,] TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
yu kj kl ky
[1,] FALSE FALSE FALSE TRUE
[2,] FALSE TRUE FALSE FALSE
[3,] FALSE TRUE FALSE FALSE
[4,] FALSE TRUE FALSE FALSE
[5,] FALSE FALSE TRUE FALSE
[6,] TRUE FALSE TRUE FALSE
Если вы не хотите использовать его в качестве полной матрицы, как описано выше, вы можете остановиться на первой строке, в которой есть все матрицы моделей в списке, по одной для каждой переменной (столбца) в dat
, и преобразовать логично. Этот однострочник делает оба шага:
> lapply(lapply(dat, function(x) model.matrix( ~ x - 1)),
+ function(x) matrix(as.logical(x), ncol = ncol(x)))
$V1
[,1] [,2] [,3]
[1,] FALSE FALSE TRUE
[2,] FALSE FALSE TRUE
[3,] FALSE FALSE TRUE
[4,] FALSE TRUE FALSE
[5,] TRUE FALSE FALSE
[6,] TRUE FALSE FALSE
$V2
[,1] [,2] [,3] [,4]
[1,] TRUE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE
[3,] FALSE TRUE FALSE FALSE
[4,] FALSE TRUE FALSE FALSE
[5,] FALSE FALSE TRUE FALSE
[6,] FALSE FALSE FALSE TRUE
$V3
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE TRUE FALSE
[2,] FALSE FALSE TRUE FALSE
[3,] TRUE FALSE FALSE FALSE
[4,] TRUE FALSE FALSE FALSE
[5,] FALSE TRUE FALSE FALSE
[6,] FALSE FALSE FALSE TRUE
$V4
[,1] [,2] [,3]
[1,] FALSE FALSE TRUE
[2,] TRUE FALSE FALSE
[3,] TRUE FALSE FALSE
[4,] TRUE FALSE FALSE
[5,] FALSE TRUE FALSE
[6,] FALSE TRUE FALSE
И если имена переменных важны, тогда мы можем изменить это на
foo <- function(x) {
mat <- matrix(as.logical(x), ncol = ncol(x))
colnames(mat) <- levels(x)
mat
}
lapply(lapply(dat, function(x) model.matrix( ~ x - 1)), foo)