【问题标题】:Converting features to dummies将特征转换为假人
【发布时间】:2018-12-09 19:51:35
【问题描述】:

我有这个矩阵:

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 列,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

【问题讨论】:

  • 请同时添加至少一小部分您的预期输出。
  • R 很少(如果有的话)需要将因子显式转换为虚拟变量,建模函数会以一种更加经过测试和安全的方式来处理这一点。
  • 我只想运行方差分析来评估tipo 是否与reacao 相关

标签: r dataframe tidyverse spread


【解决方案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 中有许多建模函数,您现在拥有所需形式的数据并可以探索它们。

【讨论】:

  • 那么我该如何为模型指定公式呢?
  • 假设我想运行方差分析,看看癌症类型是否与reacao 有关。如何指定模型的公式?
  • 已将我的 cmets 转接回答。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    另一种选择是

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-17
      • 2018-08-19
      • 2022-01-05
      • 1970-01-01
      • 2021-10-20
      • 2017-05-23
      相关资源
      最近更新 更多