R: 发现哪些学生正在提高他们的成绩

huangapple go评论89阅读模式
英文:

R: Finding Out Which Students are Improving Their Grade

问题

I am working with the R programming language.

Suppose I have the following dataset of student grades:

  1. 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))

我的问题:我想找出哪些学生的成绩在年份之间有所提高(或保持相同的成绩),以及哪些学生的成绩在年份之间下降。

使用“分组窗口函数”的思想,我尝试编写以下函数:

  1. check_grades_improvement <- function(grades){
  2. for(i in 2:length(grades)){
  3. if(grades[i] < grades[i-1]){
  4. return(FALSE)
  5. }
  6. }
  7. return(TRUE)
  8. }
  9. check_grades_decline <- function(grades){
  10. for(i in 2:length(grades)){
  11. if(grades[i] > grades[i-1]){
  12. return(FALSE)
  13. }
  14. }
  15. return(TRUE)
  16. }

然后,我尝试将这些函数应用于我的数据集:

  1. improving_students <- my_data %>%
  2. group_by(id) %>%
  3. filter(check_grades_improvement(grade)) %>%
  4. select(id) %>%
  5. unique()
  6. worse_students <- my_data %>%
  7. group_by(id) %>%
  8. filter(check_grades_decline(grade)) %>%
  9. select(id) %>%
  10. unique()

但我得到了空结果。

有人能否请告诉我我做错了什么,以及如何解决这个问题?

谢谢!

英文:

I am working with the R programming language.

Suppose I have the following dataset of student grades:

  1. 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))
  2. &gt; my_data
  3. id year grade
  4. 1 1 2010 55
  5. 2 1 2011 56
  6. 3 1 2012 61
  7. 4 1 2013 61
  8. 5 1 2014 62
  9. 6 2 2008 90
  10. 7 2 2009 89
  11. 8 2 2010 89
  12. 9 3 2018 67
  13. 10 3 2019 87
  14. 11 3 2020 51
  15. 12 3 2021 65

My Question: I want to find out which students improved their grades (or kept the same grade) from year to year, and which students got worse grades from year to year.

Using the idea of "grouped window functions", I tried to write the following functions :

  1. check_grades_improvement &lt;- function(grades){
  2. for(i in 2:length(grades)){
  3. if(grades[i] &lt; grades[i-1]){
  4. return(FALSE)
  5. }
  6. }
  7. return(TRUE)
  8. }
  9. check_grades_decline &lt;- function(grades){
  10. for(i in 2:length(grades)){
  11. if(grades[i] &gt; grades[i-1]){
  12. return(FALSE)
  13. }
  14. }
  15. return(TRUE)
  16. }

Then, I tried to apply these functions to my dataset:

  1. improving_students &lt;- my_data %&gt;% group_by(id) %&gt;%
  2. filter(check_grades_improvement(grade)) %&gt;%
  3. select(id) %&gt;%
  4. unique()
  5. worse_students &lt;- my_data %&gt;%
  6. group_by(id) %&gt;%
  7. filter(check_grades_decline(grade)) %&gt;%
  8. select(id) %&gt;%
  9. unique()

But I am getting empty results

Can someone please show me what I am doing wrong and how I can fix this?

Thanks!

答案1

得分: 3

类似于以下内容:

  1. library(dplyr)
  2. my_data %>%
  3. group_by(id) %>%
  4. mutate(x = grade-lag(grade, default = grade[1])) %>%
  5. mutate(peformance = case_when(x == 0 ~ "kept_same",
  6. x > 0 ~ "improved",
  7. x < 0 ~ "got_worse",
  8. TRUE ~ NA_character_), .keep="unused")
  1. id year grade peformance
  2. <dbl> <dbl> <dbl> <chr>
  3. 1 1 2010 55 kept_same
  4. 2 1 2011 56 improved
  5. 3 1 2012 61 improved
  6. 4 1 2013 61 kept_same
  7. 5 1 2014 62 improved
  8. 6 2 2008 90 kept_same
  9. 7 2 2009 89 got_worse
  10. 8 2 2010 89 kept_same
  11. 9 3 2018 67 kept_same
  12. 10 3 2019 87 improved
  13. 11 3 2020 51 got_worse
  14. 12 3 2021 65 improved
英文:

Something like this:

  1. library(dplyr)
  2. my_data %&gt;%
  3. group_by(id) %&gt;%
  4. mutate(x = grade-lag(grade, default = grade[1])) %&gt;%
  5. mutate(peformance = case_when(x == 0 ~ &quot;kept_same&quot;,
  6. x &gt; 0 ~ &quot;improved&quot;,
  7. x &lt; 0 ~ &quot;got_worse&quot;,
  8. TRUE ~ NA_character_), .keep=&quot;unused&quot;)
  1. id year grade peformance
  2. &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt; &lt;chr&gt;
  3. 1 1 2010 55 kept_same
  4. 2 1 2011 56 improved
  5. 3 1 2012 61 improved
  6. 4 1 2013 61 kept_same
  7. 5 1 2014 62 improved
  8. 6 2 2008 90 kept_same
  9. 7 2 2009 89 got_worse
  10. 8 2 2010 89 kept_same
  11. 9 3 2018 67 kept_same
  12. 10 3 2019 87 improved
  13. 11 3 2020 51 got_worse
  14. 12 3 2021 65 improved

答案2

得分: 2

如果我们想在第一次出现时break函数

  1. check_grades_improvement &lt;- function(grades){
  2. for(i in 2:length(grades)){
  3. if(grades[i] &lt; grades[i-1]){
  4. return(FALSE)
  5. break
  6. }
  7. }
  8. return(TRUE)
  9. }
  10. check_grades_decline &lt;- function(grades){
  11. for(i in 2:length(grades)){
  12. if(grades[i] &gt; grades[i-1]){
  13. return(FALSE)
  14. break
  15. }
  16. }
  17. return(TRUE)
  18. }

-测试

  1. my_data %&gt;%
  2. group_by(id) %&gt;%
  3. filter(check_grades_improvement(grade)) %&gt;%
  4. ungroup %&gt;%
  5. select(id) %&gt;%
  6. unique()
  7. # A tibble: 1 &#215; 1
  8. id
  9. &lt;dbl&gt;
  10. 1 1
  11. my_data %&gt;%
  12. group_by(id) %&gt;%
  13. filter(check_grades_decline(grade)) %&gt;
  14. ungroup() %&gt;
  15. select(id) %&gt;
  16. unique()
  17. # A tibble: 1 &#215; 1
  18. id
  19. &lt;dbl&gt;
  20. 1 2

或者如果是对所有情况

  1. my_data %&gt;%
  2. arrange(id, year) %&gt;%
  3. group_by(id) %&gt;%
  4. filter(c(FALSE, diff(grade) &gt; 0)) %&gt;%
  5. ungroup %&gt;%
  6. select(id) %&gt;%
  7. unique
  8. # A tibble: 2 &#215; 1
  9. id
  10. &lt;dbl&gt;
  11. 1 1
  12. 2 3
  13. my_data %&gt;%
  14. arrange(id, year) %&gt;%
  15. group_by(id) %&gt;%
  16. filter(c(FALSE, diff(grade) &lt; 0)) %&gt;%
  17. ungroup %&gt;%
  18. select(id) %&gt;%
  19. unique
  20. # A tibble: 2 &#215; 1
  21. id
  22. &lt;dbl&gt;
  23. 1 2
  24. 2 3
英文:

If we want to break the function at the first instance

  1. check_grades_improvement &lt;- function(grades){
  2. for(i in 2:length(grades)){
  3. if(grades[i] &lt; grades[i-1]){
  4. return(FALSE)
  5. break
  6. }
  7. }
  8. return(TRUE)
  9. }
  10. check_grades_decline &lt;- function(grades){
  11. for(i in 2:length(grades)){
  12. if(grades[i] &gt; grades[i-1]){
  13. return(FALSE)
  14. break
  15. }
  16. }
  17. return(TRUE)
  18. }

-testing

  1. my_data %&gt;%
  2. group_by(id) %&gt;%
  3. filter(check_grades_improvement(grade)) %&gt;%
  4. ungroup %&gt;%
  5. select(id) %&gt;%
  6. unique()
  7. # A tibble: 1 &#215; 1
  8. id
  9. &lt;dbl&gt;
  10. 1 1
  11. my_data %&gt;%
  12. group_by(id) %&gt;%
  13. filter(check_grades_decline(grade)) %&gt;%
  14. ungroup() %&gt;%
  15. select(id) %&gt;%
  16. unique()
  17. # A tibble: 1 &#215; 1
  18. id
  19. &lt;dbl&gt;
  20. 1 2

Or if it is for all instances

  1. my_data %&gt;%
  2. arrange(id, year) %&gt;%
  3. group_by(id) %&gt;%
  4. filter(c(FALSE, diff(grade) &gt; 0)) %&gt;%
  5. ungroup %&gt;%
  6. select(id) %&gt;%
  7. unique
  8. # A tibble: 2 &#215; 1
  9. id
  10. &lt;dbl&gt;
  11. 1 1
  12. 2 3
  13. my_data %&gt;%
  14. arrange(id, year) %&gt;%
  15. group_by(id) %&gt;%
  16. filter(c(FALSE, diff(grade) &lt; 0)) %&gt;%
  17. ungroup %&gt;%
  18. select(id) %&gt;%
  19. unique
  20. # A tibble: 2 &#215; 1
  21. id
  22. &lt;dbl&gt;
  23. 1 2
  24. 2 3
  25. </details>

huangapple
  • 本文由 发表于 2023年2月6日 12:29:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/75357352.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定