首页 文章

将功能转换为假人

提问于
浏览
0

我有这个矩阵:

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

我想把它变成一个tibble,这些行和列名都是虚拟变量 .

我想制作一个条形图并得到这个:

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列并且 reacao 在3中 . 现在这个tibble的第一行读起来像“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

3 回答

  • 1

    建模例程将在内部为您创建一个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中有许多建模功能,您现在可以获得所需形式的数据,并可以探索它们 .

  • 2

    另一种选择是

    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 的某对行和列创建了一个包含两列的tibble,其中行数作为 quimio 中的条目给出 . 第二行遍历所有列和行对,为每个列创建一个tibble,绑定它们,并将所有剩余的 NA 条目设置为零 .

  • 1

    不如我想要的优雅,但应该与 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))))
    

相关问题