将特征转换为假人

时间:2018-12-09 19:51:35

标签: r dataframe tidyverse spread

我有这个矩阵:

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列,而{{1} }。在3。}现在,此小标题的第一行显示为“ 51名Tipo I癌症患者患有 pouca reacao”。我曾考虑过使用reacao,但找不到合适的参数组合。任何帮助将不胜感激。

tl; dr

我需要整理spread()并且不知道如何

编辑:预期的输出应该是这样的

quimiotb

3 个答案:

答案 0 :(得分:2)

建模例程将在内部为您创建一个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

或查看Var2输出中的summary(fm1)系数的t检验,看它们是否明显不同于零。

或者您可能想对原始数据进行卡方检验

chisq.test(quimio)

无论如何,R中有许多建模函数,您现在可以使用所需格式的数据并可以对其进行浏览。

答案 1 :(得分: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))))

答案 2 :(得分:1)

另一个选择是

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条目设置为零。