我有这个矩阵:
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
答案 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.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))))
答案 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
条目设置为零。