Ваш подход идеально подходит, вам просто нужно заменить sum
на mean
и умножить на 100:
data %>% group_by(Chemical, grp = format(date, format = '%Y')) %>%
mutate(exceed = concentration >= limit) %>%
summarise(tot_exceed = mean(exceed) * 100) %>%
spread(Chemical, tot_exceed, fill = 0)
# A tibble: 2 x 4
# grp A B C
# <chr> <dbl> <dbl> <dbl>
# 1 2016 100 50 50
# 2 2017 50 100 0
Строка в вашей попытке
summarise(percent = (sum(exceed)/countconc) * 100)
делает почти так: ошибка связана с тем, что countconc
- это целый столбец, а не одно значение (которое необходимо для суммирования).Итак, поскольку в любом случае это столбец константа в каждой группе, вы могли бы написать, например,
summarise(percent = (sum(exceed)/countconc[1]) * 100)
Но, учитывая строку ранее,
mutate(exceed = concentration >= limit, countconc = length(concentration))
в конечном итоге это просто среднее значение, поэтому мы возвращаемся к коду в начале моего ответа.
Также обратите внимание, что, используя lubridate
, вы можете написать первую строку как
data %>% group_by(Chemical, Year = year(date)) %>%
Что-то очень краткое, но, возможно, не в том формате, в котором вы хотите
data %>% group_by(Chemical, Year = year(date)) %>%
summarise(Percentage = mean(concentration > limit) * 100)
# A tibble: 6 x 3
# Groups: Chemical [?]
# Chemical Year Percentage
# <fct> <dbl> <dbl>
# 1 A 2016 100
# 2 A 2017 50
# 3 B 2016 50
# 4 B 2017 100
# 5 C 2016 50
# 6 C 2017 0