在R中应用:递归函数,它根据自己以前的结果运行

Sam*_*Sam 3 r apply cumsum

如何在按行操作时应用能够"看到"前面结果的函数?

这出现了很多,但我目前的问题需要学生运行总计,如果总数没有达到5则重置.

示例数据:

> df

row   Student Absent Consecutive.Absences                             
1        A       0                    0                              
2        A       1                    1                              
3        A       1                    2                              
4        A       0                    0 <- resets to zero if under 5
5        A       0                    0                              
6        A       1                    1                              
7        A       1                    2                              
8        A       1                    3                              
9        B       1                    1 <- starts over for new factor (Student)
10       B       1                    2                              
11       B       0                    0                              
12       B       1                    1                              
13       B       1                    2                              
14       B       1                    3                              
15       B       1                    4                              
16       B       0                    0                              
17       B       1                    1                              
18       B       1                    2                              
19       B       1                    3                              
20       B       1                    4                              
21       B       1                    5                              
22       B       0                    5 <- gets locked at 5
23       B       0                    5                              
24       B       1                    6                              
25       B       1                    7             
Run Code Online (Sandbox Code Playgroud)

我试过用一个巨大的移位向量矩阵来做这个.

我已尝试使用apply系列函数执行此操作,其中一半不执行任何操作,另一半执行16 GB RAM并使计算机崩溃.

我尝试过直接循环,需要4个多小时(这是一个大数据集)

困扰我的是Excel中的这种容易程度.通常R在速度和可写性方面围绕Excel运行,这使我相信我在这里缺少一些基本的东西.

忘记即使是更具挑战性("锁定在5")的功能,我甚至无法获得重置的cumsum.没有我能想到的因素组合这样的ave:

Consecutive.Absences = ave(Absent, ..., cumsum)
Run Code Online (Sandbox Code Playgroud)

显然,对学生进行分组只会给出总累积缺失 - 它会"记住"孩子因缺席而导致的缺席,因为大脑中存在分裂和重组.

正如我所说,我不知道在R中
如何做的核心是这样的:如何应用一个能够在按行操作时"看到"前面结果的函数?

在Excel中很容易:

C3 = IF($A3=$A2,$B3+$C2,$B3)*$B3
Run Code Online (Sandbox Code Playgroud)

此excel功能在没有5-absence锁定的情况下显示,以便于阅读.

一旦我弄清楚如何应用一个函数来查看R中相同函数的先前结果,我将能够找出其余部分.

提前感谢您的帮助 - 这对我的很多应用程序非常有用!

真的,山姆


更新:
感谢大家关于如何识别学生是否连续5次缺席的想法!

但是,这很容易在STUDENTS表的数据库中完成.我需要知道的是学生在出勤记录中连续缺席的次数,例如"我们在计算其他汇总统计数据时是否计算这个特定的出勤记录?"

kit*_*ith 7

如果您希望在使用前一个元素的值时将一个函数应用于向量中的每个元素,您可能需要检出"Reduce",并将accumulate参数设置为True

这是一个例子:

##define your function that takes two parameters
##these are the 'previous' and the 'current' elements
runSum <- function(sum, x){
    res = 0
    if (x == 1){
        res = sum + 1
    }
    else if (x == 0 & sum < 5){
        res = 0
    }
    else{
        res = sum
    }
    res
}

#lets look at the absent values from subject B
x = c(1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1)

Reduce(x=x, f=runSum, accumulate=T) 
# [1] 1 2 0 1 2 3 4 0 1 2 3 4 5 5 5 6 7
Run Code Online (Sandbox Code Playgroud)