这就是我的数据框架的样子。最右边的列是我想要的列。当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]
感谢您的帮助。
答案 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))