首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用移动平均值的下一列填充NAs

使用移动平均值的下一列填充NAs
EN

Stack Overflow用户
提问于 2018-06-01 04:08:07
回答 1查看 237关注 0票数 1
代码语言:javascript
复制
set.seed(123)
df <- data.frame(loc.id = rep(c(1:3), each = 4*10), 
                       year = rep(rep(c(1980:1983), each = 10), times = 3),
                       day = rep(1:10, times = 3*4),
                       x = sample(123:200, 4*3*10, replace = T))

我想再添加一个列x.mv,它是每个loc.id和年份组合的x的3天移动平均值

代码语言:javascript
复制
df %>% group_by(loc.id,year) %>% mutate(x.mv = zoo::rollmean(x, 3, fill = "NA", align = "right"))

          loc.id  year   day     x  x.mv
          <int> <int> <int> <int> <dbl>
      1      1   1980     1   145  NA 
      2      1   1980     2   184  NA 
      3      1   1980     3   154  161 
      4      1   1980     4   191  176.
      5      1   1980     5   196  180.
      6      1   1980     6   126  171 
      7      1   1980     7   164  162 
      8      1   1980     8   192  161.
      9      1   1980     9   166  174 
      10      1  1980    10   158  172 

我想做的是用x替换x.mv列中的NAs。我试过这个:

代码语言:javascript
复制
df %>% group_by(loc.id,year) %>% mutate(x.mv = zoo::rollmean(x, 3, fill = x[1:2], align = "right"))

            loc.id  year   day     x  x.mv
            <int> <int> <int> <int> <dbl>
        1      1   1980     1   145  145 
        2      1   1980     2   184  145 
        3      1   1980     3   154  161 
        4      1   1980     4   191  176.
        5      1   1980     5   196  180.
        6      1   1980     6   126  171 
        7      1   1980     7   164  162 
        8      1   1980     8   192  161.
        9      1   1980     9   166  174 
        10     1  1980     10   158  172 

但是它所做的是用x的第一个值而不是相应的x值填充NAs,我该如何修复它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-01 04:30:59

跳过fill参数并手动填充:

代码语言:javascript
复制
df %>%
  group_by(loc.id,year) %>%
  mutate(x.mv = c(x[1:2],zoo::rollmean(x, 3, align = "right"))) %>%
  ungroup

# # A tibble: 120 x 5
#   loc.id  year   day     x     x.mv
#    <int> <int> <int> <int>    <dbl>
# 1      1  1980     1   145 145.0000
# 2      1  1980     2   184 184.0000
# 3      1  1980     3   154 161.0000
# 4      1  1980     4   191 176.3333
# 5      1  1980     5   196 180.3333
# 6      1  1980     6   126 171.0000
# 7      1  1980     7   164 162.0000
# 8      1  1980     8   192 160.6667
# 9      1  1980     9   166 174.0000
# 10     1  1980    10   158 172.0000
# # ... with 110 more rows

您可能希望使用dplyr::cummean(x[1:2])而不是x[1:2],以获得第二个值的平均值,或者在本例中,在注释中使用@g-grothendieck的建议,并将您的变异调用重写为mutate(x.mv = rollapplyr(x, 3, mean, partial = TRUE))

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50632017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档