Для полноты я добавляю базовое решение 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"]])
right = TRUE
, потому что это похоже на то, что было похоже на то, что хотел пользователь, и я упомянул аргументlabels
. – Barker 31 December 2016 в 17:46R
– bouncyball 31 December 2016 в 17:47<= 30
, так как в нижней части кода будет помещено что-либо меньше 30. – Barker 31 December 2016 в 17:51