将特征转换为虚拟对象
Converting features to dummies
我有这个矩阵:
quimio = matrix(c(51,33,16,58,29,13,48,42,30,26,38,16),
nrow = 4, ncol = 3)
colnames(quimio) = c("Pouca", "Média", "Alta")
rownames(quimio) = c("Tipo I", "Tipo II", "Tipo III", "Tipo IV")
看起来像这样:
Pouca Média Alta
Tipo I 51 29 30
Tipo II 33 13 26
Tipo III 16 48 38
Tipo IV 58 42 16
我想把它变成一个小标题,这样这些行名和列名都是虚拟变量。
我想制作条形图并得到了这个:
library(tidyverse)
tipo = c("Tipo I", "Tipo II", "Tipo III", "Tipo IV")
tipos = rep(tipo, 3)
quimiotb = as.tibble(quimio)
quimiotb = gather(quimiotb)
quimiotb$tipo = tipos
quimiotb = rename(quimiotb, reacao = key)
quimiotb$reacao = factor(quimiotb$reacao)
quimiotb$tipo = factor(quimiotb$tipo)
这是我得到的:
A tibble: 12 x 3
reacao value tipo
<fct> <dbl> <fct>
1 Pouca 51 Tipo I
2 Pouca 33 Tipo II
3 Pouca 16 Tipo III
4 Pouca 58 Tipo IV
5 Média 29 Tipo I
6 Média 13 Tipo II
7 Média 48 Tipo III
8 Média 42 Tipo IV
9 Alta 30 Tipo I
10 Alta 26 Tipo II
11 Alta 38 Tipo III
12 Alta 16 Tipo IV
虽然这对于带有 ggplot2
的条形图来说非常好,但我不能 运行 任何模型 - 这需要 tipo
分散到 4列和 3 中的 reacao
。现在这个小标题的第一行读起来像“51 名患有 Tipo I 癌症的患者有 pouca reacao”。我考虑过使用 spread()
但找不到合适的参数组合。任何帮助将不胜感激。
tl;博士
我需要整理 quimiotb
但不知道如何整理
编辑:预期输出应该是这样的
A tibble: Y x 7
Pouca Media Alta Tipo I Tipo II Tipo III Tipo IV
<fct> <fct> <fct> <fct> <fct> <fct> <fct>
1 0 1 0 0 1 0 0
2 1 0 0 1 0 0 0
建模例程将在内部为您创建一个 model.matrix,您无需指定它,所以这应该足够了。
as.data.frame.table(quimio)
model.matrix
可以从中创建模型矩阵,但您不需要它,如下面的代码所示。
现在你可以做这样的事情:
DF <- as.data.frame.table(quimio)
fm0 <- lm(Freq ~ Var1, DF) # or maybe you want Var2?
fm1 <- lm(Freq ~ Var1 + Var2, DF)
anova(fm0, fm1) # compare
或者查看 summary(fm1)
的输出中 Var2
的系数的 t 检验,看看它们是否显着不同于零。
或者您想对原始数据进行卡方检验
chisq.test(quimio)
无论如何,R 中有许多建模函数,您现在拥有所需形式的数据并可以探索它们。
不如我想要的优雅,但应该与 data.table
和 mltools
:
一起使用
> df
Tipo I Tipo II Tipo III Tipo IV Alta Média Pouca value
1: 1 0 0 0 0 0 1 51
2: 0 1 0 0 0 0 1 33
3: 0 0 1 0 0 0 1 16
4: 0 0 0 1 0 0 1 58
5: 1 0 0 0 0 1 0 29
6: 0 1 0 0 0 1 0 13
7: 0 0 1 0 0 1 0 48
8: 0 0 0 1 0 1 0 42
9: 1 0 0 0 1 0 0 30
10: 0 1 0 0 1 0 0 26
11: 0 0 1 0 1 0 0 38
12: 0 0 0 1 1 0 0 16
代码
library(data.table)
library(mltools)
df <- quimio %>%
as.data.frame() %>%
rownames_to_column() %>%
gather(key, value, -rowname) %>%
mutate(rowname = as.factor(rowname),
key = as.factor(key)) %>%
as.data.table() %>%
one_hot() %>%
rename_all(.funs = funs(sub("^.+_", "", names(df))))
另一种选择是
fun <- function(x, y) setNames(tibble(a = 1, b = 1)[rep(1, quimio[x, y]), ], c(rownames(quimio)[x], colnames(quimio)[y]))
1 * !is.na(map2_dfr(row(quimio), col(quimio), fun))
# Tipo I Pouca Tipo II Tipo III Tipo IV Média Alta
# [1,] 1 1 0 0 0 0 0
# [2,] 1 1 0 0 0 0 0
# [3,] 1 1 0 0 0 0 0
# ...
此处 fun
为 quimio
的特定行和列对创建了一个包含两列的小标题,其中行数作为 quimio
中的条目给出。第二行遍历所有列和行对,为每个列和行创建一个小标题,绑定它们,并将所有剩余的 NA
条目设置为零。
我有这个矩阵:
quimio = matrix(c(51,33,16,58,29,13,48,42,30,26,38,16),
nrow = 4, ncol = 3)
colnames(quimio) = c("Pouca", "Média", "Alta")
rownames(quimio) = c("Tipo I", "Tipo II", "Tipo III", "Tipo IV")
看起来像这样:
Pouca Média Alta
Tipo I 51 29 30
Tipo II 33 13 26
Tipo III 16 48 38
Tipo IV 58 42 16
我想把它变成一个小标题,这样这些行名和列名都是虚拟变量。
我想制作条形图并得到了这个:
library(tidyverse)
tipo = c("Tipo I", "Tipo II", "Tipo III", "Tipo IV")
tipos = rep(tipo, 3)
quimiotb = as.tibble(quimio)
quimiotb = gather(quimiotb)
quimiotb$tipo = tipos
quimiotb = rename(quimiotb, reacao = key)
quimiotb$reacao = factor(quimiotb$reacao)
quimiotb$tipo = factor(quimiotb$tipo)
这是我得到的:
A tibble: 12 x 3
reacao value tipo
<fct> <dbl> <fct>
1 Pouca 51 Tipo I
2 Pouca 33 Tipo II
3 Pouca 16 Tipo III
4 Pouca 58 Tipo IV
5 Média 29 Tipo I
6 Média 13 Tipo II
7 Média 48 Tipo III
8 Média 42 Tipo IV
9 Alta 30 Tipo I
10 Alta 26 Tipo II
11 Alta 38 Tipo III
12 Alta 16 Tipo IV
虽然这对于带有 ggplot2
的条形图来说非常好,但我不能 运行 任何模型 - 这需要 tipo
分散到 4列和 3 中的 reacao
。现在这个小标题的第一行读起来像“51 名患有 Tipo I 癌症的患者有 pouca reacao”。我考虑过使用 spread()
但找不到合适的参数组合。任何帮助将不胜感激。
tl;博士
我需要整理 quimiotb
但不知道如何整理
编辑:预期输出应该是这样的
A tibble: Y x 7
Pouca Media Alta Tipo I Tipo II Tipo III Tipo IV
<fct> <fct> <fct> <fct> <fct> <fct> <fct>
1 0 1 0 0 1 0 0
2 1 0 0 1 0 0 0
建模例程将在内部为您创建一个 model.matrix,您无需指定它,所以这应该足够了。
as.data.frame.table(quimio)
model.matrix
可以从中创建模型矩阵,但您不需要它,如下面的代码所示。
现在你可以做这样的事情:
DF <- as.data.frame.table(quimio)
fm0 <- lm(Freq ~ Var1, DF) # or maybe you want Var2?
fm1 <- lm(Freq ~ Var1 + Var2, DF)
anova(fm0, fm1) # compare
或者查看 summary(fm1)
的输出中 Var2
的系数的 t 检验,看看它们是否显着不同于零。
或者您想对原始数据进行卡方检验
chisq.test(quimio)
无论如何,R 中有许多建模函数,您现在拥有所需形式的数据并可以探索它们。
不如我想要的优雅,但应该与 data.table
和 mltools
:
> df
Tipo I Tipo II Tipo III Tipo IV Alta Média Pouca value
1: 1 0 0 0 0 0 1 51
2: 0 1 0 0 0 0 1 33
3: 0 0 1 0 0 0 1 16
4: 0 0 0 1 0 0 1 58
5: 1 0 0 0 0 1 0 29
6: 0 1 0 0 0 1 0 13
7: 0 0 1 0 0 1 0 48
8: 0 0 0 1 0 1 0 42
9: 1 0 0 0 1 0 0 30
10: 0 1 0 0 1 0 0 26
11: 0 0 1 0 1 0 0 38
12: 0 0 0 1 1 0 0 16
代码
library(data.table)
library(mltools)
df <- quimio %>%
as.data.frame() %>%
rownames_to_column() %>%
gather(key, value, -rowname) %>%
mutate(rowname = as.factor(rowname),
key = as.factor(key)) %>%
as.data.table() %>%
one_hot() %>%
rename_all(.funs = funs(sub("^.+_", "", names(df))))
另一种选择是
fun <- function(x, y) setNames(tibble(a = 1, b = 1)[rep(1, quimio[x, y]), ], c(rownames(quimio)[x], colnames(quimio)[y]))
1 * !is.na(map2_dfr(row(quimio), col(quimio), fun))
# Tipo I Pouca Tipo II Tipo III Tipo IV Média Alta
# [1,] 1 1 0 0 0 0 0
# [2,] 1 1 0 0 0 0 0
# [3,] 1 1 0 0 0 0 0
# ...
此处 fun
为 quimio
的特定行和列对创建了一个包含两列的小标题,其中行数作为 quimio
中的条目给出。第二行遍历所有列和行对,为每个列和行创建一个小标题,绑定它们,并将所有剩余的 NA
条目设置为零。