分类变量计数的热图
Heatmap of categorical variable counts
我有一个项目数据框,每个项目都有多个分类变量列。
ID test1 test2 test3
1 A B A
2 B A C
3 C C C
4 A A B
5 B B B
6 B A C
我想使用 ggplot2 为每个测试列组合(test1 v test2、test1 v test3 等)生成一个热图。
热图将在 x 侧具有该测试列(在本例中为 A、B、C)中的所有因素,在 y 侧具有其他测试的所有因素,热图中的框应根据具有该分类器组合的 ID 的计数。
例如,在上面的输入中,如果我们在 test1 和 test2 之间有热图,那么位于 test1 的 B 和 test2 的 A 的交集处的框将是最亮的,因为有 2 个 id 具有该组合。
我希望使用这些热图来分析哪些测试最适合数据集,但不能使用 Pearson 的 R 相关性,因为它们是分类变量。
我熟悉 ggplot,这就是为什么我更喜欢那个包,但如果在 pheatplot 中更容易,我可以学习它。
你的问题有点不清楚,但我想你正在寻找这样的东西。我不是 ggplot2 的人,所以我会让其他人提供该代码。
x <- read.table(text="ID test1 test2 test3
1 A B A
2 B A C
3 C C C
4 A A B
5 B B B
6 B A C", stringsAsFactors=FALSE, header=T)
xl <- reshape2::melt(data = x, id.vars="ID", variable.name = "Test", value.name="Grade")
xl$Test_Gr <- apply(xl[,2:3], 1, paste0, collapse="_")
xw <- reshape2::dcast(xl, ID ~ Test_Gr, fun.aggregate = length)
xwm <- as.matrix(xw[,-1])
xc <- t(xwm) %*% xwm
colnames(xc) <- colnames(xw)[-1]
rownames(wc) <- colnames(xw)[-1]
gplots::heatmap.2(xc, trace="none", col = rev(heat.colors(15)))
花了一些时间来了解如何去做,但我仍然不确定这是最好的方法。
数据:
dat = structure(list(ID = 1:6,
test1 = c("A", "B", "C", "A", "B", "B"),
test2 = c("B", "A", "C", "A", "B", "A"),
test3 = c("A", "C", "C", "B", "B", "C")
),
.Names = c("ID", "test1", "test2", "test3"),
class = "data.frame", row.names = c(NA, -6L)
)
图书馆
library(tidyverse)
library(ggthemes)
library(gridExtra)
一次创建 2 个因素的所有所有组合(也包括测试)
fcombs <- expand.grid(LETTERS[1:3], LETTERS[1:3], stringsAsFactors = F)
tcombs <- as.data.frame(combn(colnames(dat[,-1]), 2), stringsAsFactors = F)
lapply
通过测试组合,full_join
,统计每组不包括NA
s的长度
dtl <- lapply(tcombs, function(i){
select(dat, ID, i) %>%
full_join(x = fcombs, by = c("Var1" = i[1], Var2 = i[2])) %>%
group_by(Var1, Var2) %>%
mutate(N = sum(!is.na(ID)), ID = NULL) %>%
ungroup()
}
)
创建地块列表
pl <- lapply(seq_along(tcombs), function(i){
gtitle = paste(tcombs[[i]], collapse = " ~ ")
dtl[[i]] %>%
ggplot(aes(x = Var1, y = Var2, fill = N)) +
geom_tile() +
theme_tufte() +
theme(axis.title = element_blank()) +
ggtitle(gtitle)
}
)
创建表格列表(tableGrob
个对象)
tbl <- lapply(tcombs, function(i) tableGrob(select(dat, ID, i),
theme = ttheme_minimal()))
将所有内容放入结果列表并绘制
resl <- c(pl, tbl)[c(1, 4, 2, 5, 3, 6)]
grid.arrange(grobs = resl, ncol = 2, nrow = 3)
我有一个项目数据框,每个项目都有多个分类变量列。
ID test1 test2 test3
1 A B A
2 B A C
3 C C C
4 A A B
5 B B B
6 B A C
我想使用 ggplot2 为每个测试列组合(test1 v test2、test1 v test3 等)生成一个热图。 热图将在 x 侧具有该测试列(在本例中为 A、B、C)中的所有因素,在 y 侧具有其他测试的所有因素,热图中的框应根据具有该分类器组合的 ID 的计数。
例如,在上面的输入中,如果我们在 test1 和 test2 之间有热图,那么位于 test1 的 B 和 test2 的 A 的交集处的框将是最亮的,因为有 2 个 id 具有该组合。 我希望使用这些热图来分析哪些测试最适合数据集,但不能使用 Pearson 的 R 相关性,因为它们是分类变量。
我熟悉 ggplot,这就是为什么我更喜欢那个包,但如果在 pheatplot 中更容易,我可以学习它。
你的问题有点不清楚,但我想你正在寻找这样的东西。我不是 ggplot2 的人,所以我会让其他人提供该代码。
x <- read.table(text="ID test1 test2 test3
1 A B A
2 B A C
3 C C C
4 A A B
5 B B B
6 B A C", stringsAsFactors=FALSE, header=T)
xl <- reshape2::melt(data = x, id.vars="ID", variable.name = "Test", value.name="Grade")
xl$Test_Gr <- apply(xl[,2:3], 1, paste0, collapse="_")
xw <- reshape2::dcast(xl, ID ~ Test_Gr, fun.aggregate = length)
xwm <- as.matrix(xw[,-1])
xc <- t(xwm) %*% xwm
colnames(xc) <- colnames(xw)[-1]
rownames(wc) <- colnames(xw)[-1]
gplots::heatmap.2(xc, trace="none", col = rev(heat.colors(15)))
花了一些时间来了解如何去做,但我仍然不确定这是最好的方法。
数据:dat = structure(list(ID = 1:6,
test1 = c("A", "B", "C", "A", "B", "B"),
test2 = c("B", "A", "C", "A", "B", "A"),
test3 = c("A", "C", "C", "B", "B", "C")
),
.Names = c("ID", "test1", "test2", "test3"),
class = "data.frame", row.names = c(NA, -6L)
)
图书馆
library(tidyverse)
library(ggthemes)
library(gridExtra)
一次创建 2 个因素的所有所有组合(也包括测试)
fcombs <- expand.grid(LETTERS[1:3], LETTERS[1:3], stringsAsFactors = F)
tcombs <- as.data.frame(combn(colnames(dat[,-1]), 2), stringsAsFactors = F)
lapply
通过测试组合,full_join
,统计每组不包括NA
s的长度
dtl <- lapply(tcombs, function(i){
select(dat, ID, i) %>%
full_join(x = fcombs, by = c("Var1" = i[1], Var2 = i[2])) %>%
group_by(Var1, Var2) %>%
mutate(N = sum(!is.na(ID)), ID = NULL) %>%
ungroup()
}
)
创建地块列表
pl <- lapply(seq_along(tcombs), function(i){
gtitle = paste(tcombs[[i]], collapse = " ~ ")
dtl[[i]] %>%
ggplot(aes(x = Var1, y = Var2, fill = N)) +
geom_tile() +
theme_tufte() +
theme(axis.title = element_blank()) +
ggtitle(gtitle)
}
)
创建表格列表(tableGrob
个对象)
tbl <- lapply(tcombs, function(i) tableGrob(select(dat, ID, i),
theme = ttheme_minimal()))
将所有内容放入结果列表并绘制
resl <- c(pl, tbl)[c(1, 4, 2, 5, 3, 6)]
grid.arrange(grobs = resl, ncol = 2, nrow = 3)