累积均值不包括当前观察 - 使用cummean和group_by而忽略NA

时间:2018-04-18 21:48:50

标签: r dplyr

df <- data.frame(category=c("cat1","cat1","cat2","cat1","cat2","cat2","cat1","cat2"),
                 value=c(NA,2,3,4,5,NA,7,8))

我想在上面的数据框中添加一个新列,它将value列的累积平均值计算到先前的观察值(即不包括当前观察值),而不考虑NA。我试过了

df %>%
  group_by(category, isna = is.na(value)) %>%
  mutate(new_col = ifelse(isna, NA, cummean(lag(value))))

cummean只是不知道如何处理NAs,不幸的是lag会生成它们。

我不想将NAs算为0。

1 个答案:

答案 0 :(得分:1)

可以先锻炼cummean,然后再锻炼lag

library(dplyr)
df %>%
  group_by(category, isna = is.na(value)) %>%
  mutate(new_col = lag(cummean(value))) %>%
  ungroup() %>%
  select(-isna)


# # A tibble: 8 x 3
# category value new_col
# <fctr>   <dbl>   <dbl>
# 1 cat1     NA      NA   
# 2 cat1      2.00   NA   
# 3 cat2      3.00   NA   
# 4 cat1      4.00    2.00
# 5 cat2      5.00    3.00
# 6 cat2     NA      NA   
# 7 cat1      7.00    3.00
# 8 cat2      8.00    4.00