我试图寻找答案,但似乎无法找到适合我的工作。
我有一个包含两个变量的数据集(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轴上。
谢谢!
答案 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')
#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')
但我不喜欢这种方式,因为我认为在您的分析管道中使用中间数据步骤可用于除可视化之外的比较。
答案 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"]])