【问题标题】:Calculate mean of respective column values based on condition根据条件计算各列值的平均值
【发布时间】:2015-11-04 07:45:21
【问题描述】:

我有一个名为 sampleframe 的 data.frame,其中存储了所有表值。在sampleframe 里面我有列idmonthsold

 id month   SMarch  SJanFeb churn
 101    1   0.00    0.00    1
 101    2   0.00    0.00    1
 101    3   0.00    0.00    1
 108    2   0.00    6.00    1
 103    2   0.00    10.00   1
 160    1   0.00    2.00    1
 160    2   0.00    3.00    1
 160    3   0.50    0.00    0
 164    1   0.00    3.00    1
 164    2   0.00    6.00    1

我想根据ID 计算过去三个月的平均销量。如果是第 3 个月,则必须根据 ID 考虑过去两个月的平均销售量,如果是第 2 个月,则必须分别根据 ID 考虑 1 个月的平均销售量。

我已经使用 ifelsemean 函数来使用它,但是当我尝试使用它所有月份时,一些行丢失了

我用于执行的查询

sampleframe$Churn <- ifelse(sampleframe$Month==4|sampleframe$Month==5|sampleframe$Month==6, ifelse(sampleframe$Sold<0.7*mean(sampleframe$Sold[sampleframe$ID[sampleframe$Month==-1&sampleframe$Month==-2&sampleframe$Month==-3]]),1,0),0)

根据查询的逻辑添加它应该与前几个月的销售价值 70% 进行比较,如果当前值高于以前的平均月份值,那么它应该返回 1 else 0

【问题讨论】:

  • 请学习如何format your question text
  • 嗨,Jaap,感谢您的建议,但表格值如何显示
  • 你能更新预期的输出吗?
  • @akrun 输出它应该根据售价显示 0 或 1
  • @Pallavi 如果您还可以使用预期输出进行更新以便我们可以交叉检查结果,那将非常有帮助。

标签: r


【解决方案1】:

不清楚预期的输出。根据关于计算每 3 个月平均“已售出”的描述,按“id”分组,我们可以使用library(RcppRoll) 中的roll_mean。我们将'data.frame'转换为'data.table'(setDT(df1)),按'id'分组,if的行数大于1,我们得到roll_meann指定为3 并与小于 3 或else 的平均值连接,即对于 1 次观察,获取值本身。

library(RcppRoll)
library(data.table)
k <- 3
setDT(df1)[, soldAvg := if(.N>1) c(cumsum(sold[1:(k-1)])/1:(k-1), 
      roll_mean(sold,n=k, align='right')) else as.numeric(sold), id]

df1
 #     id month sold  soldAvg
 #1: 101     1  124 124.0000
 #2: 101     2  211 167.5000
 #3: 104     3  332 332.0000
 #4: 105     4  124 124.0000
 #5: 101     5  211 182.0000
 #6: 101     6  332 251.3333
 #7: 101     7  124 222.3333
 #8: 101     8  211 222.3333
 #9: 101     9  332 222.3333
#10: 102    10  124 124.0000
#11: 102    12  211 167.5000
#12: 104     3  332 332.0000
#13: 105     4  124 124.0000
#14: 102     5  211 182.0000
#15: 102     6  332 251.3333
#16: 106     7  124 124.0000
#17: 107     8  211 211.0000
#18: 102     9  332 291.6667
#19: 103    11  124 124.0000
#20: 103     2  211 167.5000
#21: 108     3  332 332.0000
#22: 108     4  124 228.0000
#23: 109     5  211 211.0000
#24: 103     6  332 222.3333
#25: 104     7  124 262.6667
#26: 105     8  211 153.0000
#27: 103    10  332 291.6667

【讨论】:

  • 安装库文件后,当我尝试在 R studio 中执行上述语句时,它显示“找不到函数 roll_mean”
  • @Pallavi 在RcppRoll。你安装了吗?
  • 我已经安装好了 :)
  • @Pallavi 在运行代码之前你有没有打电话给library(RcppRoll)。我不清楚二进制部分。
  • 是的,添加库(RcppRoll) 后可以执行代码。在代码中,“n”表示什么
【解决方案2】:

上述问题的解决方案可以通过使用 library(dplyr) 来完成,并使用此查询来利用输出

resultData <- group_by(data, KId) %>% 
    arrange(sales_month) %>% 
    mutate(monthMinus1Qty = lag(quantity_sold,1), monthMinus2Qty = lag(quantity_sold, 2)) %>% 
    group_by(KId, sales_month) %>%
    mutate(previous2MonthsQty = sum(monthMinus1Qty, monthMinus2Qty, na.rm = TRUE)) %>%  
    mutate(result = ifelse(quantity_sold/previous2MonthsQty >= 0.6,0,1)) %>%
    select(KId,sales_month, quantity_sold, result)

链接参考解决方案和输出Answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多