0

我想将一个值基于另一个值出现的次数相加。示例数据:

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 中做一个热图并且需要一个数据框。我一直在拔头发——必须有一个简单的方法。

4

2 回答 2

4

表格输出可以转换为数据框。根据所需的输出使用其中之一:

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)
于 2021-05-03T19:23:59.727 回答
2

我想在 ggplot 中做一个热图并且需要一个数据框。

一个选项可能是stat_bin_2d()

library(ggplot2)
ggplot(df, aes(hour, name)) +
  stat_bin_2d()

结果

在此处输入图像描述

来自?stat_bin_2d

将平面划分为矩形,计算每个矩形中的案例数,然后(默认情况下)将案例数映射到矩形的填充。

于 2021-05-03T19:35:37.803 回答