我想将一个值基于另一个值出现的次数相加。示例数据:
df <- data.frame(hour = c("1", "2", "1", "2", "3", "2", "3"), name = c("A", "B", "A", "B", "C", "A", "B"))
使用 table ( table(df$hour, df$name
) 给了我完全正确的输出,但我不想要一个表 - 我想在 ggplot 中做一个热图并且需要一个数据框。我一直在拔头发——必须有一个简单的方法。
表格输出可以转换为数据框。根据所需的输出使用其中之一:
as.data.frame.matrix(table(df))
library(tibble)
rownames_to_column(as.data.frame.matrix(table(df)), "hour")
as.data.frame(table(df))
关于热图,请注意heatmap
在 R 的基础中直接接受table
输出(并且此处未显示的 gplots::balloonplot 也接受表格输出):
heatmap(table(df))
也可以在 ggpubr::balloonplot、lattice::levelplot 或 ggplot2 中使用as.data.frame(table(df))
:
library(ggpubr)
ggballoonplot(as.data.frame(table(df)))
library(lattice)
levelplot(Freq ~ hour * name, as.data.frame(table(df)))
library(dplyr)
library(ggplot2)
df %>%
table %>%
as.data.frame %>%
ggplot(aes(hour, name, fill = Freq)) + geom_tile()
输出看起来像这样(有关生成此代码的代码,请参见末尾的注释):
df <- structure(list(hour = c("1", "2", "1", "2", "3", "2", "3"), name = c("A",
"B", "A", "B", "C", "A", "B")), class = "data.frame", row.names = c(NA,
-7L))
library(cowplot)
library(gridGraphics)
heatmap(table(df), main = "heatmap")
# convert from classic to grid graphics to later combine
grid.echo()
p1 <- grid.grab()
library(ggpubr)
p2 <- ggballoonplot(as.data.frame(table(df))) +
ggtitle("ggubr::ggballoonplot")
library(lattice)
p3 <- levelplot(Freq ~ hour * name, as.data.frame(table(df)),
main = "lattice::levelplot")
library(magrittr)
library(ggplot2)
p4 <- df %>%
table %>%
as.data.frame %>%
ggplot(aes(hour, name, fill = Freq)) + geom_tile() + ggtitle("ggplot2")
plot_grid(p2, p3, p4, p1, nrow = 2)