具有附加条件的唯一唯一变量的累积总和

时间:2016-04-14 14:42:00

标签: r data.table dplyr

这就是我的数据框架的样子。最右边的列是我想要的列。当ActivityType为Sale时,我试图获得独特FundTypes的累积总和。所以第一行有一个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]

感谢您的帮助。

1 个答案:

答案 0 :(得分: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))