使用R查找基于条件返回值的函数
我有一张有价值观的桌子使用R查找基于条件返回值的函数,r,R,我有一张有价值观的桌子 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_mon
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。需要解决方案来执行此操作
提前感谢。如果我理解清楚,您的要求是将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)
最后,让我们只显示我们关心的列(而不是所有这些中间步骤)
我相信这应该能满足你的要求。NA是由于0/0除法导致的结果列,或者前几个月没有任何数据。
如果需要将计算扩展到一个日历年之外,可以添加“年”列并适当调整group_by()参数。
有关dplyr包的更多信息,跟随你自己有没有尝试过这个问题?@ZDavies我用Mysql查询做过它,用case语句的子查询做得很好,但是当我尝试用ifelse做数据帧时,它是徒劳的,记录丢失,输出错误。告诉我们你到目前为止做了什么。。。你的问题也不清楚。。。1月(1日)和2月(2日)两个月的60%是什么意思。。。您的数据中有多个1和2…@Gaurav,使用sampleBubble$Resulty您不能包含部分
mean(样本Bubble$Quantity_Saled[sampleBubble$KId[sampleBubble$Sales_Month==-1&sampleBubble$Sales_Month==-2&sampleBubble$Sales_Month==-3]])
在您的ifelse
语句中ifelse
语句只能对照同一行中的值或以前定义的具有绝对值的变量检查特定行的值。。。如果您从ifelse语句中的ceratain数据帧的所有行中派生一个值,该语句作用于同一数据帧的行,它将抛出NA…Hi,这有助于我检索所需的数据,但如何隐藏数据中使用的变异列。frameHi可以使用subset()隐藏这些列但是如何删除那些要替换为0的NA以显示如上所示的精确输出我编辑了答案以显示另一个关于如何仅显示相关列的解决方案。要替换NAs,只需使用resultData$result[is.na(resultData$result)]
select(KId,sales_month, quantity_sold, result)