我有一个面板数据集,其中包含以下列/变量: Week(t)、Custid(i)、Activity(i、t)、Initial(i)和大量其他变量。我需要创建一个新的变量体验(i,t) = alpha *体验(i,t-1) +活动(i,t-1)。经验的初始值(i,0)=初始(I)。我是R的新手,刚开始从SAS到R的过渡,我如何在客户层面和每周创建新的可变体验。也就是说,该变量在第一周t周的值将取决于该变量在过去一周(t-1)的滞后值,再加上客户i在过去一周(t-1)所做的活动。请帮帮忙,我有一个超级紧迫的时间来解决这个问题。真诚感谢您的所有帮助!
发布于 2014-07-11 04:13:44
我假设这是您的输入数据
#sample data
set.seed(15)
dd<-data.frame(
week=rep(1:5, 3),
cust=rep(1:3, each=5),
activity=runif(15)
)
init<-c(1,2,3)
alpha<-.5看起来就像
week cust activity
1 1 1 0.6021140
2 2 1 0.1950439
3 3 1 0.9664587
4 4 1 0.6509055
5 5 1 0.3670719
6 1 2 0.9888592
7 2 2 0.8151934
8 3 2 0.2539684
9 4 2 0.6872308
10 5 2 0.8314290
11 1 3 0.1046694
12 2 3 0.6461509
13 3 3 0.5090904
14 4 3 0.7066286
15 5 3 0.8623137然后我们计算出
Experience <- Map(function(i,d)
Reduce(function(a,b)
{alpha*a + b}, d$activity, i, accumulate=TRUE),
init, split(dd, dd$cust)
)我们使用外部Map来迭代使用split创建的每个客户的初始值和数据子集。然后,内部Reduce实现了您所描述的滞后算法。
然后,要将其加入到表中,我们需要从列表中删除初始值,并按顺序重新堆栈这些值。我们可以用
ExpCol <- unsplit(lapply(Experience, tail, -1), dd$cust)
cbind(dd, ExpCol)这给了我们
week cust activity ExpCol
1 1 1 0.6021140 1.1021140
2 2 1 0.1950439 0.7461009
3 3 1 0.9664587 1.3395092
4 4 1 0.6509055 1.3206601
5 5 1 0.3670719 1.0274020
6 1 2 0.9888592 1.9888592
7 2 2 0.8151934 1.8096230
8 3 2 0.2539684 1.1587799
9 4 2 0.6872308 1.2666208
10 5 2 0.8314290 1.4647394
11 1 3 0.1046694 1.6046694
12 2 3 0.6461509 1.4484856
13 3 3 0.5090904 1.2333332
14 4 3 0.7066286 1.3232952
15 5 3 0.8623137 1.5239612https://stackoverflow.com/questions/24689859
复制相似问题