Надеюсь, это поможет!
library(tidyverse)
df %>%
select(-time) %>%
gather(key, intensity, -id) %>%
group_by(id, intensity, key) %>%
tally() %>%
spread(key, n) %>%
replace(is.na(.), 0)
Вывод:
id intensity x1 x2 x3
1 1 Light 0 2 1
2 1 Moderate 3 0 2
3 1 Sedentary 1 0 1
4 1 Vigorous 0 2 0
5 2 Light 2 0 2
6 2 Moderate 1 1 0
7 2 Sedentary 0 2 0
8 2 Vigorous 0 0 1
Пример данных:
df <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), time = c("10:30",
"10:31", "10:32", "10:33", "12:24", "12:25", "12:26"), x1 = c("Moderate",
"Moderate", "Sedentary", "Moderate", "Light", "Moderate", "Light"
), x2 = c("Light", "Light", "Vigorous", "Vigorous", "Moderate",
"Sedentary", "Sedentary"), x3 = c("Light", "Moderate", "Moderate",
"Sedentary", "Light", "Light", "Vigorous")), class = "data.frame", row.names = c(NA,
-7L))
# id time x1 x2 x3
#1 1 10:30 Moderate Light Light
#2 1 10:31 Moderate Light Moderate
#3 1 10:32 Sedentary Vigorous Moderate
#4 1 10:33 Moderate Vigorous Sedentary
#5 2 12:24 Light Moderate Light
#6 2 12:25 Moderate Sedentary Light
#7 2 12:26 Light Sedentary Vigorous