【问题标题】:Find a function to return value based on condition using R使用R查找基于条件返回值的函数
【发布时间】:2015-11-05 07:01:15
【问题描述】:

我有一个包含值的表格

KId sales_month quantity_sold
100        1    0
100        2    0
100        3    0
496        2    6
511        2    10
846        1    4
846        2    6
846        3    1
338        1    6
338        2    0    

现在我需要输出为

KId sales_month quantity_sold result
100           1     0         1
100           2     0         1
100           3     0         1
496           2     6         1
511           2     10        1
846           1     4         1
846           2     6         1
846           3     1         0
338           1     6         1
338           2     0         1

在这里,如果 3 月 (3) 月份的销售量小于 1 月 (1) 和 2 月 (2) 两个月的 60%,则计算必须如此结果应该是1,否则应该显示0。需要解决方案来执行此操作。

提前致谢。

【问题讨论】:

  • 你自己有没有尝试过这个问题?
  • @ZDavies 我已经通过使用 Mysql 查询来完成它,它通过使用带有 case 语句的子查询可以正常工作,但是当我尝试通过使用 ifelse 作为数据帧来实现它时,它会因丢失记录而徒劳无功并且输出错误。
  • 向我们展示您到目前为止所做的尝试...您的问题也不清楚... 一月(1)和二月(2)两个月的 60% 是什么意思...那里您的数据中有多个 1 和 2...
  • @Gaurav,使用 sampleBubble$result
  • 您不能在ifelse 语句中包含mean(sample‌​Bubble$Quantity_Sold[sampleBubble$KId[sampleBubble$Sales_Month==-1&sampleBubble$S‌​ales_Month==-2&sampleBubble$Sales_Month==-3]]) 部分... ifelse 语句只能根据同一行中的值或先前定义的变量检查特定行的值具有绝对值...如果您从 ifelse 语句中某个数据帧的所有行中派生一个值,该语句作用于同一数据帧的一行,它将抛出 NA...

标签: r


【解决方案1】:

如果我理解得很好,您的要求是将 t 月的销售量与 t-1 月和 t-2 月的销售量总和进行比较。如果是这样,我可以建议使用 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)

结果如下:

添加

select(KId,sales_month, quantity_sold, result)

最后让我们只显示我们关心的列(而不是所有这些中间步骤)。

我相信这应该可以满足您的要求。 NA 是结果列是由于前几个月的 0/0 除法或根本没有数据。 如果您需要将计算扩展到超过一个日历年,您可以添加 year 列并适当调整 group_by() 参数。 有关 dplyr 包的更多信息,请关注this link

【讨论】:

  • 嗨,这帮助我检索了预期的数据,但是我如何隐藏那些在 data.frame 中使用的变异列
  • 您可以通过使用子集()来隐藏这些列,但是如何删除那些 NA 以替换为 0 以显示如上所示的准确输出
  • 我编辑了答案以显示另一种关于如何仅显示相关列的解决方案。要替换 NA,您可以使用 resultData$result[is.na(resultData$result)]
猜你喜欢
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2019-12-29
  • 2019-02-21
  • 1970-01-01
相关资源
最近更新 更多