首页 > 解决方案 > 用 R 按一组间隔计算两列中的条目数

问题描述

我有两列填充了来自类似分布的数字。我想在图表上绘制所选间隔内每列的密度。我不知道如何最好地描述,所以我希望下面的代码能说明我的意图。

我的数据与此有些相似。

library(tidyverse)
df <- data.frame(A = rnorm(1000, 0 5), B = rnorm(1000, 10, 5)

到目前为止,我能想到的最好的方法包括左连接,但它不是一个理想的方法。

df$Cut_A <- cut(df$A, seq(-30, 30, 5)
df$Cut_B <- cut(df$B, seq(-30, 30, 5)

df_a <- df %>% group_by(Cut_A) %>% summarise(count_A = n())
df_b <- df %>% group_by(Cut_B) %>% summarise(count_B = n())

df2 <- left_join(df_a, df_b, by = c('Cut_A' = 'Cut_B'))

DF2 缺少某些区间的计数,因为它们未出现在 A 列中。

非常感谢任何更好的方法或修复来获得所需的图表。

标签: rplotgraphdplyrtidyverse

解决方案


您不需要手动离散化变量和计数频率,ggplot::geom_histogram()可以在后台完成所有这些操作:

data.frame(A = rnorm(1000, 0, 5), B = rnorm(1000, 10, 5)) %>% 
  # Gather the two variables into one column:
  gather %>% 
  # gather() created two columns: 'key' and 'value'
  ggplot(aes(x = value, fill = key)) +
  # Plot the frequency within each of your desired bins using the "breaks" argument:
  geom_histogram(breaks = seq(-30, 30, 5))

在此处输入图像描述

解释

当您使用收集(不命名任何要排除的列)时,它将所有变量以长格式放入一个名为“值”的列中。在另一个名为“key”的列中,原始变量名称将针对最初包含该变量的每一行数据重复。当您绘制它时,将填充颜色分配给变量将为“键”中的每个变量创建一个直方图。然后,您可以使用 break 参数设置 bin 以剪切变量,就像使用cut. 它将对每个变量进行相同的分箱并分别计算频率,因为您将“填充”设置为“键”中的单独变量。


推荐阅读