2016-04-14 15 views
2

So sieht mein Datenframe aus. Die Spalte ganz rechts ist meine gewünschte Spalte. Ich versuche, die kumulative Summe der eindeutigen FundTypes zu erhalten, wenn der ActivityType Sale ist. Die erste Zeile hat also activitytype == email, daher gibt es keine kumulative Summe, dasselbe gilt für die zweite Zeile, die dritte Zeile hat activitytype == sale und sie sollte die kumulative Summe als 1 anzeigen, da die Bedingung erfüllt ist.Kumulative Summe einer eindeutigen Variablen mit angehängter Bedingung

library(data.table) 
dt <- fread(' 
Name  ActivityType  FundType UniqueFundsSale(Desired) 
John  Email    a   0      
John  Webinar    b   0     
John  Sale    a   1     
John  Sale    b   2      
John  Webinar    c   2      
John  Sale    a   2      
John  Sale    b   2      
John  Sale    c   3      
Tom  Email    a   0      
Tom  Webinar    b   0     
Tom  Sale    a   1     
Tom  Sale    b   2      
Tom  Webinar    c   2      
Tom  Sale    a   2      
Tom  Sale    b   2      
Tom  Sale    c   3') 

Ich habe Folgendes versucht.

dt[, UniqueFundsSale := 
    cumsum(ActivityType=="Sale" & !duplicated(FundType,ActivityType) & !FundType=="") 
, by = Name] 

Vielen Dank für Ihre Hilfe.

+0

Fyi, können Sie 'fread ("Text Text Text") Auch ein Beispiel zu konstruieren. – Frank

+0

@Frank Danke Frank. Das wusste ich nicht. Also kann ich ein Beispiel mit fread konstruieren und es direkt an stackoverflow schicken? – gibbz00

+0

Ja, ich werde es bearbeiten, um zu demonstrieren. – Frank

Antwort

5

Hier ist eine Art und Weise (Danke für Vereinfachungen @eddi):

w = dt[ActivityType == "Sale", .I[1L], by = .(Name, FundType)]$V1 
dt[, new_col := cumsum(.I %in% w), by = Name] 

Das nächste Analogon in Basis R ist wahrscheinlich

dt$idx = seq_len(nrow(dt)) 
w = with(dt[dt$ActivityType == "Sale"], 
    c(tapply(idx, list(Name, FundType), FUN = `[`, 1L))) 
dt$new_col = ave(dt$idx, dt$Name, FUN = function(x) cumsum(x %in% w)) 
+1

Vielen Dank für Ihre Antwort! – gibbz00