【问题标题】:r data.table filter based on count of rows satisfying a conditionr data.table 过滤器基于满足条件的行数
【发布时间】:2019-09-16 08:14:03
【问题描述】:

我正在学习 data.table 并在一个地方感到困惑。需要帮助以了解如何实现以下目标。我拥有的数据,我需要过滤掉那些在第 1 个时期的销售额为 0 或在至少 14 个时期的销售额不大于 0 的品牌。我已经尝试过,我认为我已经实现了第一部分....但是我无法获得第二部分过滤那些在至少 14 个时期内销售额不 > 0 的品牌。

以下是我编写的示例数据和代码。请建议我如何实现第二部分?

library(data.table)
#### set the seed value
set.seed(9901)

#### create the sample variables for creating the data
group <- sample(1:7,1200,replace = T)
brn <- sample(1:10,1200,replace = T)
period <- rep(101:116,75)
sales <- sample(0:50,1200,replace = T)

#### create the data.table
df1 <- data.table(cbind(group,brn,period,sales))

#### taking the minimum value by group x brand x period
df1_min <- df1[,.(min1 = min(sales,na.rm = T)),by = c('group','brn','period')][order(group,brn,period)]

#### creating the filter
df1_min$fil1 <- ifelse(df1_min$period == 101 & df1_min$min1 == 0,1,0)

谢谢!!

【问题讨论】:

  • 能否详细说明组变量是如何输入的?在针对 14 期限制进行评估之前,是否应在各组之间汇总每个品牌的期正销售额?
  • J.G. 的评论上面的数据有一些问题。 group、brn 和 period 是否构成主键? (有重复,但应将销售额相加)。另外,缺失的三人组是否可以认为销售额为 0?
  • @J.G.需要在组内每个品牌都有 # 个具有正销售额的时期。所以聚合必须发生在 x 组品牌
  • @JonNagra 我们可以在原始数据中有重复的行,因为每行是销售记录......所以如果一个品牌有多行意味着该品牌在多个场合被销售...... .我同意在这种情况下还需要有产品列,但我相信它不会妨碍我们的聚合
  • 所以,如果我理解正确,一个 brn 可以从一组中取消资格(其中#sales>0 小于 14 个句点),但保留在另一个组中(>14 个)?或者,如果在任何组中,#sales>0 小于 14,则 brn 是否被取消资格?

标签: r filter count data.table


【解决方案1】:

假设第一个限制适用于数据集范围的最小周期 (101),这意味着仍然包括以大于 101 的 0-销售周期开始的 brn/group 对。

# 1. brn/group pairs with sales of 0 in the 1st period.
brngroup_zerosales101 = df1[sales == 0 & period == min(period), .(brn, group)]

# 2a. Identify brn/group pairs with <14 positive sale periods
df1[, posSale := ifelse(sales > 0, 1, 0)] # Was the period sale positive?

# 2b. For each brn/group pair, sum posSale and filter posSale < 14
brngroup_sub14 = df1[, .(GroupBrnPosSales = sum(posSale)), by = .(brn, group)][GroupBrnPosSales < 14, .(brn, group)]

# 3. Join the two restrictions
restr = rbindlist(list(brngroup_zerosales101, brngroup_sub14)) 

df1[, ID := paste(brn, group)] # Create a brn-group ID
restr[, ID := paste(brn, group)] # See above

filtered = df1[!(ID %in% restr[,ID]),]

【讨论】:

  • 谢谢JG。这是有帮助的!我只需要在 rbindlist 中添加 fill = T ,因为 brngroup_zerosales101 有 2 列,而 brngroup_sub14 有 3 列。
  • 干杯。修复了 brngroup_sub14 中的列选择。
  • 谢谢!!你似乎很擅长链接......我正在学习
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
相关资源
最近更新 更多