【问题标题】:Cumulative sum of an unique only variable with attached condition具有附加条件的唯一唯一变量的累积和
【发布时间】:2016-04-14 14:41:59
【问题描述】:

这就是我的数据框的样子。最右边的列是我想要的列。当 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]

感谢您的帮助。

【问题讨论】:

  • 仅供参考,您也可以fread("text text text") 构建示例。
  • @Frank 谢谢弗兰克。我不知道。所以我可以使用 fread 构建一个示例并将其直接发布到 stackoverflow?
  • 是的,我会编辑它来演示一下。

标签: r data.table dplyr


【解决方案1】:

这是一种方法(感谢@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))

【讨论】:

  • 非常感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2014-01-03
  • 2013-03-19
  • 2019-08-07
  • 2018-06-28
  • 1970-01-01
相关资源
最近更新 更多