2016-04-14 104 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