2016-04-14 105 views
2

這就是我的數據框的外觀。最右邊的列是我想要的列。我試圖在ActivityType爲Sale時獲得唯一FundType的累積和。所以第一行有一個activitytype == email,因此沒有累計和,第二行相同,第三行有activitytype == sale,並且它應該顯示累計和爲1,因爲條件滿足。帶附加條件的唯一唯一變量的累積和

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') 

我試過以下。

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

謝謝你的幫助。

+0

據透露,就可以'FREAD( 「文本文本文本」) '也構建一個例子。 – Frank

+0

@Frank謝謝弗蘭克。我不知道。所以我可以使用fread構建一個示例並直接將其發佈到stackoverflow? – gibbz00

+0

是的,我會編輯它來演示。 – Frank

回答

5

這裏有一種方法(感謝@eddi爲簡化):

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

在基礎R最相近的是可能

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

非常感謝您的回答! – gibbz00