我正在使用 R 编程语言。
假设我有以下学生成绩数据集:
my_data = data.frame(id = c(1,1,1,1,1,2,2,2,3,3,3,3), year = c(2010,2011,2012,2013, 2014, 2008, 2009, 2010, 2018, 2019, 2020, 2021), grade = c(55, 56, 61, 61, 62, 90,89,89, 67, 87, 51, 65))
> my_data
id year grade
1 1 2010 55
2 1 2011 56
3 1 2012 61
4 1 2013 61
5 1 2014 62
6 2 2008 90
7 2 2009 89
8 2 2010 89
9 3 2018 67
10 3 2019 87
11 3 2020 51
12 3 2021 65
我的问题:我想了解哪些学生的成绩逐年提高(或保持相同的成绩),以及哪些学生的成绩逐年变差。
利用“分组窗口函数”的思想,我尝试编写以下函数:
check_grades_improvement <- function(grades){
for(i in 2:length(grades)){
if(grades[i] < grades[i-1]){
return(FALSE)
}
}
return(TRUE)
}
check_grades_decline <- function(grades){
for(i in 2:length(grades)){
if(grades[i] > grades[i-1]){
return(FALSE)
}
}
return(TRUE)
}
然后,我尝试将这些函数应用到我的数据集:
improving_students <- my_data %>% group_by(id) %>%
filter(check_grades_improvement(grade)) %>%
select(id) %>%
unique()
worse_students <- my_data %>%
group_by(id) %>%
filter(check_grades_decline(grade)) %>%
select(id) %>%
unique()
但我得到空结果
有人可以告诉我我做错了什么以及如何解决这个问题吗?
谢谢!
最佳答案
类似这样的事情:
library(dplyr)
my_data %>%
group_by(id) %>%
mutate(x = grade-lag(grade, default = grade[1])) %>%
mutate(peformance = case_when(x == 0 ~ "kept_same",
x > 0 ~ "improved",
x < 0 ~ "got_worse",
TRUE ~ NA_character_), .keep="unused")
id year grade peformance
<dbl> <dbl> <dbl> <chr>
1 1 2010 55 kept_same
2 1 2011 56 improved
3 1 2012 61 improved
4 1 2013 61 kept_same
5 1 2014 62 improved
6 2 2008 90 kept_same
7 2 2009 89 got_worse
8 2 2010 89 kept_same
9 3 2018 67 kept_same
10 3 2019 87 improved
11 3 2020 51 got_worse
12 3 2021 65 improved
关于R:找出哪些学生的成绩正在提高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75357352/