花了一些时间才意识到如何做到这一点,但我仍然不确定这是最好的方法。
数据:
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)