将特征转换为虚拟对象

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.tablemltools:

一起使用
> 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
# ...

此处 funquimio 的特定行和列对创建了一个包含两列的小标题,其中行数作为 quimio 中的条目给出。第二行遍历所有列和行对,为每个列和行创建一个小标题,绑定它们,并将所有剩余的 NA 条目设置为零。