将一个类别从另一个类别中按四分之一减去R

将一个类别从另一个类别中按四分之一减去R,r,R,我想按季度(仅一年)减去每个类别的销售额,第一季度从10中减去 Qtr Category Value 202001 1 10 202002 1 40 202003 1 100 202004 1 20 202001 2 80 202002

我想按季度(仅一年)减去每个类别的销售额,第一季度从10中减去

        Qtr    Category         Value 
202001      1             10    
202002      1             40    
202003      1             100    
202004      1             20     
202001      2             80    
202002      2             90    
202003      2             4    
202004      2             7    
201901      1             8
201902      1             9
201903      1             20
20194       1             30
结果:

        Qtr    Name         Value 
202001      1             0    
202002      1             30    
202003      1             60    
202004      1             -80    
202001      2             70    
202002      2             10    
202003      2             -86    
202004      2             3    
201901      1             -2
201902      1             1
201903      1             11
20194       1             10

下面是一个带有
ave
的基本R解决方案

with(df1, ave(Value, Category, FUN = function(x){c(x[1] - 10, diff(x))}))
# [1]   0  30  60 -80  70  10 -86   3 -12   1  11  10
然后,将此结果分配到相应的数据集列

数据

df1 <- read.table(text = "
        Qtr    Category         Value 
202001      1             10    
202002      1             40    
202003      1             100    
202004      1             20     
202001      2             80    
202002      2             90    
202003      2             4    
202004      2             7    
201901      1             8
201902      1             9
201903      1             20
201904       1             30
", header = TRUE)

df1这是我使用tidyverse的解决方案。首先,我导入保存在fa.txt中的数据,更正“四分之一”列中的最后一个值,并将“值”列从整数转换为数字

library(tidyverse)

df <- read.table("fa.txt", header = TRUE)

df[df$Qtr == 20194, "Qtr"] <- 201904
df$Value <- as.numeric(df$Value)

df <- df %>%
  mutate(interm = str_replace(Qtr, "(\\d{2})$", ".\\1")) %>%
  separate(interm, c("Year", "Quarter"), "\\.") %>%
  group_by(Year, Category) %>%
  mutate(New_Value = if_else(Quarter == "01", Value - 10, Value - lag(Value)))
库(tidyverse)
df%
变异(新值=如果其他(季度==“01”,值-10,值-滞后(值)))

您能验证您期望的结果吗?例如,为什么要从第三行中减去40?Upvote,但我认为不需要将Value列从integer转换为numeric。如果有小数出现,R会处理。我也这么认为,但每当我使用if_else函数时,就会收到一条错误消息,告诉我需要转换为数字。这是因为
if_else
ifelse
更严格。我没有抓住那一点。但在这种情况下,我仍然不会强制使用数值并使用
if-else
,if-else
的速度增益很小。