使用总和而不是计数绘制分箱数据

Plotting binned data using sum instead of count

我试图寻找答案,但似乎找不到适合我的答案。

我有一个包含两个变量的数据集 (data):人们的年龄 (age) 和获奖数量 (awards)

我的 objective 是在 R 中根据年龄绘制奖项数量。仅供参考,一个人可以有多个奖项,而且人们可以有相同的年龄。

我尝试绘制直方图和条形图,但问题是它计算的是观察次数,而不是奖励次数的总和。

示例数据集:

age <- c(21,22,22,25,30,34,45,26,37,46,49,21)
awards <- c(0,3,2,1,0,0,1,3,1,1,1,1)
data <- data.frame(cbind(age,awards))

我正在寻找的是表示此数据的直方图(或条形图)。

理想情况下,我希望将年龄分成不同的年龄组。例如, 20-30, 31-40, 41-50 然后是各组的总奖数。

年龄组将在 x 轴上,每个年龄组的奖项总数将在 y 轴上。

谢谢!

我们可以使用aggregate函数,然后使用ggplot2包。这些天我没有在基础 R 中制作太多条形图,所以我不确定在不加载的情况下最好的方法 ggplot2:

创建示例数据

#data
set.seed(123)
dat <- data.frame(age = sample(20:50, 200, replace = TRUE),
                  awards = rpois(200, 3))
head(dat)
  age awards
1  28      2
2  44      6
3  32      3
4  47      3
5  49      2
6  21      5

按年龄

#aggregate

sum_by_age <- aggregate(awards ~ age, data = dat, FUN = sum)

library(ggplot2)

ggplot(sum_by_age, aes(x = age, y = awards))+
    geom_bar(stat = 'identity')

按年龄段

#create groups

dat$age_group <- ifelse(dat$age <= 30, '20-30',
                        ifelse(dat$age <= 40, '30-40',
                               '41 +'))

sum_by_age_group <- aggregate(awards ~ age_group, data = dat, FUN = sum)

ggplot(sum_by_age_group, aes(x = age_group, y = awards))+
    geom_bar(stat = 'identity')

备注

我们可以完全跳过 aggregate 步骤,只使用:

ggplot(dat, aes(x = age, y = awards)) + geom_bar(stat = 'identity')

但我不喜欢这种方式,因为我认为在您的分析管道中进行中间数据步骤可能比可视化更有用。

为了完整起见,我将基础 R 解决方案添加到@bouncyball 的出色回答中。我将使用他们的合成数据,但我将使用 cut 在聚合之前创建年龄组。

# Creates data for plotting
> set.seed(123)
> dat <- data.frame(age = sample(20:50, 200, replace = TRUE),
                    awards = rpois(200, 3))

# Created a new column containing the age groups
> dat[["ageGroups"]] <- cut(dat[["age"]], c(-Inf, 20, 30, 40, Inf),
                            right = FALSE)

cut 将根据第二个参数中定义的分隔符划分一组数值数据。 right = FALSE 翻转中断,因此值组将包括较低的值而不是较高的值(即 20 <= x < 30 而不是默认值 20 < x <= 30)。这些组不必等距。如果您不想包含高于或低于某个值的数据,只需分别从末尾删除 Inf 或从开头删除 -Inf,函数将 return <NA> 反而。如果您想给您的组命名,您可以使用 labels 参数。

现在我们可以aggregate基于我们创建的组。

> (summedGroups <- aggregate(awards ~ ageGroups, dat, FUN = sum))
  ageGroups awards
1   [20,30)    188
2   [30,40)    212
3 [40, Inf)    194

最后,我们可以使用 barplot 函数绘制这些数据。这里的关键是使用 names 作为年龄段。

> barplot(summedGroups[["awards"]], names = summedGroups[["ageGroups"]])