如何在不使用 R 中的表的情况下对分类值的实例求和?

Posted

技术标签:

【中文标题】如何在不使用 R 中的表的情况下对分类值的实例求和?【英文标题】:How do I sum instances of a categorical value without using table in R? 【发布时间】:2021-07-26 04:51:12 【问题描述】:

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

df <- data.frame(hour = c("1", "2", "1", "2", "3", "2", "3"), name = c("A", "B", "A", "B", "C", "A", "B"))

使用表格 (table(df$hour, df$name) 给了我完全正确的输出,但我不想要表格 - 我想在 ggplot 中做一个热图并且需要一个数据框。我一直在拔头发 - 必须有一个简单的方法。

【问题讨论】:

【参考方案1】:

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

as.data.frame.matrix(table(df))

library(tibble)
rownames_to_column(as.data.frame.matrix(table(df)), "hour")

as.data.frame(table(df))

热图

关于热图请注意,R 基础中的 heatmap 直接接受 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)

【讨论】:

【参考方案2】:

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

一个选项可能是stat_bin_2d()

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

结果

来自?stat_bin_2d

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

【讨论】:

以上是关于如何在不使用 R 中的表的情况下对分类值的实例求和?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在没有重复数据的情况下对两个具有连接的表求和?

如何在不删除重复值的情况下对数据集进行分组

SQL:如何在不覆盖结果的情况下对表的同一列进行多次连接?

如何在不使用 SQL Server/MS Access 的所有选定列的情况下进行分组和求和?

如何在不通过 valgrind 命令选项启动 Process 的每个实例的情况下对每个实例进行 valgrind memcheck

如何在不使用 GROUP BY 子句的情况下对行进行分组