R 如何循环计算

R 如何循环计算,r,loops,R,Loops,我正在将线性模型与此数据进行拟合: data <- data.frame(Student_ID =c(1,1,1,2,2,3,3,3,3,3,4,4,4,5,6,6,7,7,7,8,8), Years_Attended = c(1991,1992,1995,1992,1993,1991,1992,1993,1994,1995,1993,1994,1995,1995,1993,1995,1990,1995,2000,1995,1996),

我正在将线性模型与此数据进行拟合:

data <- data.frame(Student_ID =c(1,1,1,2,2,3,3,3,3,3,4,4,4,5,6,6,7,7,7,8,8),
                   Years_Attended = c(1991,1992,1995,1992,1993,1991,1992,1993,1994,1995,1993,1994,1995,1995,1993,1995,1990,1995,2000,1995,1996),
                   Class = c("A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","C","C","C","C","C"),
                   marks = c(50,55,46,44,60,66,67,80,91,90,70,75,76,77,77,82,89,88,88,64,65))
data%摘要(
Good.marks=长度(marks[!is.na(marks)]),
marks.change=ifelse(好的.marks>1,
总结(lm(马克~u年出席)$系数[2,1],0),
学生ID=唯一(学生ID),
类别=唯一(类别),
)
这段代码运行良好。然而,与一次考虑所有年份不同,我希望将上述模型(即我所说的“marks.change=…”)适用于年份中的每个间隔,然后对它们进行平均。这意味着我想在1991年和1992年之间拟合模型,然后移动到1992年和1993年,然后移动到1993年和1994年等,直到最后一年,然后将这些计算的平均值放在一个新的列中,称为marks.change.part2


有没有更简单的方法来自动执行此操作?

您可以稍微简化现有代码

data %>% group_by(Student_ID, Class) %>% summarise(
  Good.marks = sum(!is.na(marks)),
  marks.change = ifelse(Good.marks>1,
                        summary(lm(marks ~ Years_Attended))$coefficients[2, 1], 0),
  )

# A tibble: 8 x 4
# Groups:   Student_ID [8]
  Student_ID Class Good.marks marks.change
       <dbl> <chr>      <int>        <dbl>
1          1 A              3        -1.46
2          2 A              2        16.  
3          3 A              5         7.2 
4          4 B              3         3.  
5          5 B              1         0   
6          6 B              2         2.50
7          7 C              3        -0.1 
8          8 C              2         1.00
data%>%分组依据(学生ID,班级)%>%总结(
Good.marks=总和(!is.na(marks)),
marks.change=ifelse(好的.marks>1,
总结(lm(马克~u年出席)$系数[2,1],0),
)
#一个tibble:8x4
#组别:学生证[8]
学生证班级好。成绩。变化
1 A 3-1.46
2 A 2 16。
3 A 5 7.2
44B3。
5b10
6B22.50
7 C 3-0.1
8 C 2 1.00
现在你的问题部分-如果我理解正确,也许你想要这个实际上,两点数据上的线性模型只不过是手动计算斜率,您可以使用简单的向量数学轻松计算。

data %>% group_by(Student_ID, Class) %>% summarise(
  Good.marks = sum(!is.na(marks)),
  marks.change = ifelse(Good.marks>1,
                        summary(lm(marks ~ Years_Attended))$coefficients[2, 1], 0),
  marks.change.part2 = ifelse(Good.marks>1, mean(diff(marks)/diff(Years_Attended)), 0))

# A tibble: 8 x 5
# Groups:   Student_ID [8]
  Student_ID Class Good.marks marks.change marks.change.part2
       <dbl> <chr>      <int>        <dbl>              <dbl>
1          1 A              3        -1.46                1  
2          2 A              2        16.                 16  
3          3 A              5         7.2                 6  
4          4 B              3         3.                  3  
5          5 B              1         0                   0  
6          6 B              2         2.50                2.5
7          7 C              3        -0.1                -0.1
8          8 C              2         1.00                1 
data%>%分组依据(学生ID,班级)%>%总结(
Good.marks=总和(!is.na(marks)),
marks.change=ifelse(好的.marks>1,
总结(lm(马克~u年出席)$系数[2,1],0),
marks.change.part2=ifelse(良好分数>1,平均值(分数差异)/参加年数差异),0)
#一个tibble:8x5
#组别:学生证[8]
学生证班级好。分数。改变分数。改变。第2部分
1 A 3-1.46 1
2 A 2 16。16
3 A 5 7.2 6
44B3。3.
55B100
6 B 2 2.50 2.5
7 C 3-0.1-0.1
8 C 2 1.00 1

@AnilGoyal,谢谢你的评论。当我注意到你已经回答了这个问题时,我正在准备期望的输出。这就是我要找的,谢谢。我还刚刚了解到,在stackoverflow上有“如果我的答案有帮助,请给我买杯咖啡”的规定。然而,当我点击“借记卡或信用卡”时,它只是说你的付款方式被拒绝了,而没有将我转到付款网关谢谢你的手势。我要看一下咖啡页。目前,如果我的回答真的对你有帮助的话,你只能投我的赞成票
data %>% group_by(Student_ID, Class) %>% summarise(
  Good.marks = sum(!is.na(marks)),
  marks.change = ifelse(Good.marks>1,
                        summary(lm(marks ~ Years_Attended))$coefficients[2, 1], 0),
  marks.change.part2 = ifelse(Good.marks>1, mean(diff(marks)/diff(Years_Attended)), 0))

# A tibble: 8 x 5
# Groups:   Student_ID [8]
  Student_ID Class Good.marks marks.change marks.change.part2
       <dbl> <chr>      <int>        <dbl>              <dbl>
1          1 A              3        -1.46                1  
2          2 A              2        16.                 16  
3          3 A              5         7.2                 6  
4          4 B              3         3.                  3  
5          5 B              1         0                   0  
6          6 B              2         2.50                2.5
7          7 C              3        -0.1                -0.1
8          8 C              2         1.00                1