R:计算每月缺失值

时间:2018-04-11 12:10:26

标签: r

我得到了一个包含月度值的数据集,除了每季度末有季度汇总数据。我对这几个月的月度价值感兴趣,但这需要计算。因此,对于第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.我正在尝试创建一个代码,对所有名称,所有年份,所有季度都执行此操作,但是我似乎找不到自动化的方法。

4 个答案:

答案 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的可能性,如果它按NameYearMonth排序,如下例所示:

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