根据另一列R中的引用选择行
我不确定这个标题是否真的反映了我想要做的事情。最后,我希望在根据另一列R中的引用选择行,r,R,我不确定这个标题是否真的反映了我想要做的事情。最后,我希望在ActionType列中按组选择具有特定模式的行。分组变量为email。对于每封电子邮件,如果ActionType的第一行是赢的,那么我想删除它并查看第二行。如果ActionType的第二行是赢的,那么我想删除它并移到下一行,依此类推 基本上,条件1是每封电子邮件的第一行必须是非赢的 下一步,一旦满意了,我想选择从第一行(这不是一个胜利)到下一个胜利的一切 然后,该过程将重复自身,直到按组检查完所有行。我不在乎胜利后发生的争吵,除非它们
ActionType
列中按组选择具有特定模式的行。分组变量为email
。对于每封电子邮件
,如果ActionType
的第一行是赢的,那么我想删除它并查看第二行。如果ActionType
的第二行是赢的,那么我想删除它并移到下一行,依此类推
基本上,条件1是每封电子邮件的第一行必须是非赢的
下一步,一旦满意了,我想选择从第一行(这不是一个胜利)到下一个胜利的一切
然后,该过程将重复自身,直到按组检查完所有行。我不在乎胜利后发生的争吵,除非它们发生在另一场胜利之前。另外,如果两个胜利是背靠背的,那么我想选择第一个胜利之前的行(包括该胜利)。删除在之后发生的行,然后继续检查行并保留在另一个win之前的行
我曾尝试将cumsum
与dplyr
和data.table
一起使用,但可能需要分几个步骤来完成
以下是我的数据的外观:
email Action ActionType Date
wwww Company won 1/17/14
wwww Company trial 1/22/14
wwww Event Meeting 1/24/14
wwww Event Meeting 2/24/14
wwww Gmail Email 9/10/14
wwww Company won 9/11/14
wwww Company won 9/25/14
wwww Event Support 10/7/14
wwww Company won 10/22/14
wwww Company won 12/31/14
wwww Gmail Email 2/13/15
wwww Gmail Email 2/27/15
wwww Gmail Email 3/6/15
wwww Gmail Email 3/26/15
wwww Gmail Email 4/20/15
wwww Gmail Email 4/24/15
wwww Gmail Email 5/13/15
xxxx Company trial 1/17/14
xxxx Gmail Email 1/22/14
xxxx Event Meeting 1/24/14
xxxx Company won 2/24/14
xxxx Gmail Email 9/10/14
xxxx Gmail Email 9/11/14
xxxx Gmail Email 9/25/14
xxxx Gmail Email 10/7/14
xxxx Gmail Email 10/22/14
yyyy Company won 1/24/14
yyyy Company trial 2/24/14
yyyy Task Call 9/10/14
yyyy Task Call 9/11/14
yyyy Task Call 9/25/14
yyyy Company won 10/7/14
yyyy Gmail Email 10/22/14
yyyy Gmail Email 12/31/14
zzzz Company won 9/11/14
zzzz Company won 9/25/14
zzzz Task Call 10/7/14
zzzz Task Call 10/22/14
zzzz Company trial 12/31/14
zzzz Gmail Email 2/13/15
zzzz Company won 2/27/15
zzzz Gmail Email 3/6/15
zzzz Gmail Email 3/26/15
所以我希望最终结果是这样的
email Action ActionType Date
wwww Company trial 1/22/14
wwww Event Meeting 1/24/14
wwww Event Meeting 2/24/14
wwww Gmail Email 9/10/14
wwww Company won 9/11/14
wwww Event Support 10/7/14
wwww Company won 10/22/14
xxxx Company trial 1/17/14
xxxx Gmail Email 1/22/14
xxxx Event Meeting 1/24/14
xxxx Company won 2/24/14
yyyy Company trial 2/24/14
yyyy Task Call 9/10/14
yyyy Task Call 9/11/14
yyyy Task Call 9/25/14
yyyy Company won 10/7/14
zzzz Task Call 10/7/14
zzzz Task Call 10/22/14
zzzz Company trial 12/31/14
zzzz Gmail Email 2/13/15
zzzz Company won 2/27/15
这里有一个方法:
library(data.table)
# cut off leading wins and trailing nonwins
goodi = DT[, .I[
rev(cumsum(rev(ActionType=="won"))) > 0L &
cumsum(ActionType!="won") > 0L
], by=email]$V1
# take the first win when there's a succession of 'em
DT[goodi, r := rleid(ActionType=="won"), by=email]
badi = DT[!is.na(r), .I[ ActionType=="won" & 1:.N > 1], by=.(email,r)]$V1
DT[, r := NULL]
DT[setdiff(goodi,badi)]
它给出了所需的输出
email Action ActionType Date
1: wwww Company trial 1/22/14
2: wwww Event Meeting 1/24/14
3: wwww Event Meeting 2/24/14
4: wwww Gmail Email 9/10/14
5: wwww Company won 9/11/14
6: wwww Event Support 10/7/14
7: wwww Company won 10/22/14
8: xxxx Company trial 1/17/14
9: xxxx Gmail Email 1/22/14
10: xxxx Event Meeting 1/24/14
11: xxxx Company won 2/24/14
12: yyyy Company trial 2/24/14
13: yyyy Task Call 9/10/14
14: yyyy Task Call 9/11/14
15: yyyy Task Call 9/25/14
16: yyyy Company won 10/7/14
17: zzzz Task Call 10/7/14
18: zzzz Task Call 10/22/14
19: zzzz Company trial 12/31/14
20: zzzz Gmail Email 2/13/15
21: zzzz Company won 2/27/15
email Action ActionType Date
我很好奇你对cumsum的尝试是什么样子的。这似乎是这项工作的正确工具。为什么2014年2月24日xxxx公司赢得了这项工作?同样地,
zzzz Cirrus赢了2015年2月27日
。xxxx公司赢了2014年2月24日
,因为它前面的动作类型不是“赢”。由于该域的前两行是“wins”,第一个条件是按组选择第一行ActionType!='“赢”