使用sum而不是count来绘制分箱数据

时间:2016-12-31 15:25:07

标签: r histogram bar-chart data-visualization

我试图寻找答案,但似乎无法找到适合我的工作。

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

我的目标是在R.FYI中绘制年龄奖励的数量,一个人可以有多个奖项,人们可以拥有相同的年龄。

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

样本数据集:

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轴上。

谢谢!

2 个答案:

答案 0 :(得分:6)

我们可以使用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')

age plot

按年龄组

#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')

age group plot

注意

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

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

age plot no aggregate

但我不喜欢这种方式,因为我认为在您的分析管道中使用中间数据步骤可用于除可视化之外的比较。

答案 1 :(得分:3)

为了完整起见,我将基础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,该函数将返回<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"]])

summed barplot