我得到了一个包含月度值的数据集,除了每季度末有季度汇总数据。我对这几个月的月度价值感兴趣,但这需要计算。因此,对于第3个月,第6个月,第9个月和第12个月,需要进行计算,减去前两个月的值。
df <- data.frame(Name = c('AAA', 'AAA', 'AAA', 'AAA', 'AAA', 'AAA',
'BBB', 'BBB', 'BBB', 'BBB', 'BBB', 'BBB'),
Month = c('1', '2', '3', '4', '5', '6',
'1', '2', '3', '4', '5', '6'),
Year = c(2017, 2017, 2017, 2017, 2017, 2017,
2017, 2017, 2017, 2017, 2017, 2017),
Value = c(100, 105, 315, 115, 120, 360,
100, 110, 330, 130, 140, 420))
在这个玩具示例中,2017年第3个月的AAA值为110,此值应替换为315.我正在尝试创建一个代码,对所有名称,所有年份,所有季度都执行此操作,但是我似乎找不到自动化的方法。
答案 0 :(得分:1)
你可以试试这个
library(dplyr)
df %>% mutate(Value = ifelse(as.numeric(Month) %% 3 == 0,
Value - lag(Value,1) - lag(Value, 2),
Value))
答案 1 :(得分:1)
使用ave
:
df$Value <- ave(1:nrow(df),df$Name,df$Year,
FUN = function(x){
w <- which(df$Month[x] %in% c('3','6','9','12'))
v <- df$Value[x]
v[w] <- v[w] - v[w-1] - v[w-2]
v
})
> df
Name Month Year Value
1 AAA 1 2017 100
2 AAA 2 2017 105
3 AAA 3 2017 110
4 AAA 4 2017 115
5 AAA 5 2017 120
6 AAA 6 2017 125
7 BBB 1 2017 100
8 BBB 2 2017 110
9 BBB 3 2017 120
10 BBB 4 2017 130
11 BBB 5 2017 140
12 BBB 6 2017 150
注意:df
需要至少按Month
升序排序
答案 2 :(得分:1)
data.table
的可能性,如果它按Name
,Year
,Month
排序,如下例所示:
library(data.table)
setDT(df)
df[, Month := as.numeric(Month)]
df[Month %% 3 == 0,
Value := Value - df[Month %% 3 != 0,Value][c(T,F)] - df[Month %% 3 != 0,Value][c(F,T)]]
答案 3 :(得分:0)
稍微不同的方法,创建四分之一的假人和分组。
最后一行评估哪些月可以被3整除,并计算您的预期值。
要将其用于整年,只需将replicate
命令更改为rep(1:4, each = 3)
library(dplyr)
df %>%
group_by(Name, Year) %>%
mutate(quarter = rep(1:2, each = 3)) %>%
group_by(Name, Year, quarter) %>%
mutate(Value = ifelse(Month %% 3 == 0, 2*Value - sum(Value), Value))
# A tibble: 12 x 5
# Groups: Name, Year, quarter [4]
Name Month Year Value quarter
<fct> <dbl> <dbl> <dbl> <int>
1 AAA 1. 2017. 100. 1
2 AAA 2. 2017. 105. 1
3 AAA 3. 2017. 110. 1
4 AAA 4. 2017. 115. 2
5 AAA 5. 2017. 120. 2
6 AAA 6. 2017. 125. 2
7 BBB 1. 2017. 100. 1
8 BBB 2. 2017. 110. 1
9 BBB 3. 2017. 120. 1
10 BBB 4. 2017. 130. 2
11 BBB 5. 2017. 140. 2
12 BBB 6. 2017. 150. 2