通过R中的ID计算另一列中特定值之前的行的列总和

通过R中的ID计算另一列中特定值之前的行的列总和,r,function,for-loop,R,Function,For Loop,这是我几天前提出的一个问题的延续。原始数据如下所示: E_Add Action ActionType Call Callback Email xxxx Task Call 1 0 0 xxxx Task Call 1 0 0 xxxx Event Start 0 0 0 xxxx Task Call 1 0

这是我几天前提出的一个问题的延续。原始数据如下所示:

E_Add  Action  ActionType  Call  Callback  Email
xxxx   Task    Call        1     0         0
xxxx   Task    Call        1     0         0
xxxx   Event   Start       0     0         0
xxxx   Task    Call        1     0         0
xxxx   Event   Trial       0     0         0
yyyy   Task    Call        1     0         0
yyyy   Task    Callback    0     1         0
yyyy   Task    Email       0     0         1
yyyy   Task    Call        1     0         0
yyyy   Event   Start       0     0         0    
这就是我希望数据的外观:

   Email Action ActionType Call Callback Emails CallSum CallBackSum EmailSum
1   xxxx   Task       Call    1        0      0                             
2   xxxx   Task       Call    1        0      0                             
3   xxxx  Event      Start    0        0      0       2           0        0
4   xxxx   Task       Call    1        0      0                             
5   xxxx  Event      Trial    0        0      0       1           0        0
6   yyyy   Task       Call    1        0      0                             
7   yyyy   Task   Callback    0        1      0                             
8   yyyy   Task      Email    0        0      1                             
9   yyyy   Task       Call    1        0      0                             
10  yyyy  Event      Start    0        0      0       2           1        1
这是一些生成原始数据集的代码。这不是我自己的代码;不是我写的

基本上,代码做了我希望它做的事情,但是在我的大数据集中,它不能正常工作。我需要知道一种方法,将此代码包装成一个函数,并应用于相同电子邮件地址的块,如apply by email address。现在,代码将对调用、电子邮件和回调进行求和,然后在每次到达事件时重置求和。我需要它重置每次一个新的电子邮件地址是达到。我想让它循环浏览电子邮件地址,点击一个事件,然后统计事件之前的呼叫、回调和电子邮件,并将这些总和放入新的列中

也可能出现这样一种情况,即发生一个事件,之后会有一些活动,然后是另一个事件。因此,我需要计算第二个事件之前的活动,因为在第一个事件之前没有该电子邮件地址的呼叫、电子邮件或回调

我试过这个:

e_all_copy$CallSum=''
e_all_copy$CallBackSum=''
e_all_copy$EmailSum=''


get.total <- function(x) { for(i in 1:nrow(x)) {

  CSum =0
  CBSum =0
  ESum =0

  CSum = CSum+ x[[4]][i]
  CBSum = CBSum+ x[[5]][i]
  ESum = ESum+ x[[6]][i]

  if(x[[2]][i] == 'Event'){

    #
    x[[7]][i] = CSum
    x[[8]][i] = CBSum
    x[[9]][i] = ESum

    #clear out vars
    CSum =0
    CBSum =0
    ESum =0
  }
  CSum
  CBSum
  ESum
}}


e_all_summed <- ddply(e_all_copy,.(email),get.total)

但输出只是所有唯一电子邮件地址的列表,旁边为NULL。非常感谢您的帮助!谢谢

链接到您之前提出的问题可能有助于理解上下文。我在中为您提供了解决方案。有什么问题吗?@DavidArenburg我对提供的for-loop解决方案很好奇。
e_all_copy$CallSum=''
e_all_copy$CallBackSum=''
e_all_copy$EmailSum=''


get.total <- function(x) { for(i in 1:nrow(x)) {

  CSum =0
  CBSum =0
  ESum =0

  CSum = CSum+ x[[4]][i]
  CBSum = CBSum+ x[[5]][i]
  ESum = ESum+ x[[6]][i]

  if(x[[2]][i] == 'Event'){

    #
    x[[7]][i] = CSum
    x[[8]][i] = CBSum
    x[[9]][i] = ESum

    #clear out vars
    CSum =0
    CBSum =0
    ESum =0
  }
  CSum
  CBSum
  ESum
}}


e_all_summed <- ddply(e_all_copy,.(email),get.total)