如何在不使用 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 Server/MS Access 的所有选定列的情况下进行分组和求和?
如何在不通过 valgrind 命令选项启动 Process 的每个实例的情况下对每个实例进行 valgrind memcheck