Я хочу заполнить свой набор данных Panel строками на основе существующего диапазона переменных группировки.
Для лучшего понимания я буду использовать пример набора данных:
> df<-data.frame(Student=c(1, 1, 2), Year=c(1,2,2), Type=c("Test","Exam","Test"),Points=c(80,140,30))
> df
Student Year Type Points
1 1 1 Test 80
2 1 2 Exam 140
3 2 2 Test 30
То, что я хочу иметь, - это для каждого ученика на каждый год две аберрации, основанные на наборе баллов. После преобразования должно выглядеть так:
> df2<-data.frame(Student=c(1, 1, 1,1,2,2,2,2), Year=c(1,1,2,2,1,1,2,2), PointRange=c("0_100","100_200","0_100","100_200","0_100","100_200","0_100","100_200"), n_tests=c(1,0,0,0,0,0,1,0), n_exams=c(0,0,0,1,0,0,0,0))
> df2
Student Year PointRange n_tests n_exams
1 1 1 0_100 1 0
2 1 1 100_200 0 0
3 1 2 0_100 0 0
4 1 2 100_200 0 1
5 2 1 0_100 0 0
6 2 1 100_200 0 0
7 2 2 0_100 1 0
8 2 2 100_200 0 0
Я попробовал следующее с dplyr-package:
df %>% mutate(PointRange = case_when(Points >= 0 & Points <= 100 ~ 1, Points >= 101 & Points <= 200 ~ 2)) %>%
+ group_by(Student, Year, PointRange) %>%
+ summarise(n_tests = sum(Type == "Test"),
+ n_exams = sum(Type=="Exam"))
# A tibble: 3 x 5
# Groups: Student, Year [?]
Student Year PointRange n_tests n_exams
<dbl> <dbl> <dbl> <int> <int>
1 1 1 1 1 0
2 1 2 2 0 1
3 2 2 1 1 0
Чего не хватает, так это пяти рядов, так что для каждого пользователя у меня есть два диапазона баллов на каждый год. Как я могу это исправить?