通过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)