- library('dplyr')
- df<-data.frame(index=1:9,name=c('A','B','C','A','A','C','B','C','A'),amount=c(10,14,3,4,15,9,12,6,7))
- prev<-function(x) {
- index.x<-which(df#name==x)
- index.x.lag<-lag(index.x)
- df#index_prev[index.x]<<-df#index[index.x.lag]
- df#amount_prev[index.x]<<-df#amount[index.x.lag]
- }
- lapply(levels(df#name),prev)
复制代码
程序执行结果保存在df数据框中。论坛好像不支持美元符号,以上代码把#改成$即可。
需要注意的几个点:
1、定义了prev函数,参数为x,x可以为A、B、C。
2、在prev函数中需要对df变量进行操作,由于涉及函数变量作用域的问题,函数体中用到了<<-赋值方法。
3、用到了dplyr::lag()函数,用于对A、B、C的索引进行滞后。
4、使用了factor函数提取name列中的因子,当然也可以分别执行prev("A")、prev("B")、prev("C"),但如果name列涉及更多的元素(比如26个字母),这种办法可以简化操作。