将一个类别从另一个类别中按四分之一减去R
我想按季度(仅一年)减去每个类别的销售额,第一季度从10中减去将一个类别从另一个类别中按四分之一减去R,r,R,我想按季度(仅一年)减去每个类别的销售额,第一季度从10中减去 Qtr Category Value 202001 1 10 202002 1 40 202003 1 100 202004 1 20 202001 2 80 202002
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
的速度增益很小。