2015-08-31 2 views
-1

Я не уверен, действительно ли название действительно отражает то, что я хочу делать. В конечном итоге я хочу выбрать строки по группам, которые имеют определенный шаблон в столбце ActionType. Переменная группировки - email. Для каждого email, если первая строка ActionType является победой, я хочу ее удалить и посмотреть на вторую строку. Если вторая строка ActionType является победой, я хочу ее удалить и перейти к следующей строке и так далее.Выберите строки, основанные на вхождениях в другом столбце. R

В основном условие 1 - это первая строка для каждого электронного письма, которая должна быть чем угодно, кроме победы.

Следующий раз, когда все было удовлетворено, я хочу выбрать все, начиная с первой строки (это ничего, кроме выигрыша) до следующей победы.

Затем процесс повторяется, пока не будут проверены все строки по группам. Меня не волнуют строки, которые происходят после победы, если они не предшествуют другой победе. Также, если две победы вернутся назад, я хочу выбрать строки до первой победы (включая эту победу). Удалите тот, который происходит после, а затем продолжите проверку строк и сохранение тех, которые предшествуют другому выигрышу.

Я пробовал использовать 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 
+1

Мне любопытно, что ваши попытки с 'cumsum' выглядеть. Это похоже на правильный инструмент для работы. – Frank

+0

Почему компания 'xxxx выиграла 2/24/14'? И так же «zzzz Cirrus выиграл 2/27/15' ... – Frank

+0

' xxxx Компания выиграла 2/24/14' включена, так как перед ней есть ActionTypes, которые не «выигрывают». И то же самое для 'zzzz Cirrus выиграл 2/27/15', так как первые две строки для этого домена« выигрывают », а первое условие - выбирать по группе, где первая строка« ActionType! = 'Won'' – Hillary

ответ

2

Вот один из способов:

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 
Смежные вопросы