【问题标题】:R: Finding Out Which Students are Improving Their GradeR:找出哪些学生的成绩提高了
【发布时间】:2023-02-06 12:41:10
【问题描述】:

我正在使用 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()

但我得到的结果是空的

有人可以告诉我我做错了什么以及如何解决这个问题吗?

谢谢!

【问题讨论】:

  • 你能显示你的预期输出吗?您的函数正在检查每一行,因此在某些年份它可以是 TRUE 或 FALSE。

标签: r


【解决方案1】:

代码似乎缺少将 check_grades_improvementcheck_grades_decline 函数应用于每组学生的 grade 列的重要步骤。您可以使用 dplyr 包的 summarize 函数将函数应用于每组学生的成绩列:

library(dplyr)

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) %>% 
  summarize(improvement = check_grades_improvement(grade)) %>% 
  filter(improvement == TRUE) %>% 
  select(id) %>% 
  unique()

worse_students <- my_data %>% 
  group_by(id) %>% 
  summarize(decline = check_grades_decline(grade)) %>% 
  filter(decline == TRUE) %>% 
  select(id) %>% 
  unique()

这段代码应该给你成绩提高的学生和成绩差的学生的正确结果。

【讨论】:

    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多