У меня есть фрейм данных, структура которого похожа на следующую:
set.seed(123)
df<-data_frame(SectionName = rep(letters[1:2], 50),
TimeSpentSeconds = sample(0:360, 100, replace = TRUE),
Correct = sample(0:1, 100, replace = TRUE))
Я хочу суммировать этот фрейм данных, взяв все значения TimeSpentSeconds, которые попадают в определенные диапазоны (меньше 30, между 30-60, между 60-90, ..., больше 180), помечать время как эти диапазоны , сгруппируйте их по SectionName и найдите сумму столбца Correct, чтобы результирующий фрейм данных выглядел (как-то) так:
TimeGroup SectionName Correct
<fct> <chr> <int>
1 LessThan30Secs a 2
2 LessThan30Secs b 3
3 30-60 Seconds a 4
4 30-60 Seconds b 3
5 60-90 Seconds a 2
6 60-90 Seconds b 3
7 90-120 Seconds a 4
8 90-120 Seconds b 0
9 120-150 Seconds a 4
10 120-150 Seconds b 0
11 150-180 Seconds a 1
12 150-180 Seconds b 2
13 GreaterThan180Seconds a 11
14 GreaterThan180Seconds b 11
Мне удалось успешно сделать это с помощью следующего кода if-else, где я все время мутировал в новый столбец с соответствующей меткой, сгруппировал и суммировал:
x <- c("LessThan30Secs", "30-60 Seconds", "60-90 Seconds","90-120 Seconds",
"120-150 Seconds", "150-180 Seconds", "GreaterThan180Seconds")
df %>%
mutate(TimeGroup = if_else(TimeSpentSeconds >= 0 & TimeSpentSeconds <= 30, "LessThan30Secs",
if_else(TimeSpentSeconds > 30 & TimeSpentSeconds <= 60, "30-60 Seconds",
if_else(TimeSpentSeconds > 60 & TimeSpentSeconds <= 90, "60-90 Seconds",
if_else(TimeSpentSeconds > 90 & TimeSpentSeconds <= 120, "90-120 Seconds",
if_else(TimeSpentSeconds > 120 & TimeSpentSeconds <= 150, "120-150 Seconds",
if_else(TimeSpentSeconds > 150 & TimeSpentSeconds <= 180, "150-180 Seconds",
if_else(TimeSpentSeconds > 180, "GreaterThan180Seconds", "")))))))) %>%
mutate(TimeGroup = factor(TimeGroup, levels = x)) %>%
arrange(TimeGroup) %>%
group_by(TimeGroup, SectionName) %>%
summarise(Correct = sum(Correct))
Но, просто должен быть лучший способ сделать это. Я подумал о написании функции, но не очень далеко, потому что я не очень хорош в написании функций.
Есть ли у кого-нибудь идеи относительно более элегантного способа выполнения этого же вывода с помощью метода dplyr, о котором я не думал, написания пользовательской функции, возможно, с использованием пакета purrr в какой-то момент или некоторой другой функции r?