【问题标题】:Rolling averages for grouped data and more than one variable分组数据和多个变量的滚动平均值
【发布时间】:2021-10-18 17:14:56
【问题描述】:

我想获得两个变量和分组数据在时间 't-1'、't-2、't-3' 等处的滚动平均值。下面的代码没有按变量londeglatdeg 分组,变量vw 和3 天的窗口。 如何让代码为longdeglatdeg 分组的数据运行,并为变量uwvw 计算?

数据一览:

structure(list(dateday = structure(c(18525, 18525, 18525, 18525, 
18525, 18525, 18525, 18525, 18525, 18525, 18525, 18525, 18525, 
18525, 18525, 18525, 18525, 18525, 18525, 18525), class = "Date"), 
    latdeg = c(39.875, 39.875, 39.875, 39.875, 39.875, 39.875, 
    39.875, 39.875, 39.875, 39.875, 39.875, 39.875, 39.875, 39.875, 
    39.875, 39.875, 39.875, 39.875, 39.875, 39.875), londeg = c(0.125, 
    0.375, 0.625, 0.875, 1.125, 1.375, 1.625, 1.875, 2.125, 2.375, 
    2.625, 2.875, 3.125, 3.375, 3.625, 3.875, 4.125, 4.375, 4.625, 
    4.875), uw = c(-4.0046167, -2.9436386, -1.384588, -0.0981078, 
    1.0286689, 1.91347, 2.4027817, 2.6116273, 2.7161477, 2.6292932, 
    2.5535467, 1.9434952, 1.0219297, 0.6225892, 0.40092927, 0.5625489, 
    1.1099254, 1.4549272, 1.716492, 2.1899667), vw = c(1.6297868, 
    2.7284932, 3.7426023, 3.9648964, 3.8228495, 3.5595078, 3.2727604, 
    2.994605, 2.795548, 2.652693, 1.9364153, 0.73406154, -0.4248537, 
    -1.1846231, -1.6087885, -1.7109653, -1.2042828, -0.75072134, 
    -0.56564194, -0.34468606)), row.names = c(NA, 20L), class = "data.frame")

代码(来自https://stackoverflow.com/a/64575069/14535832

  library(tidyverse)
  library(slider)

  df <- 1:3 %>%
  map(~slide_dbl(df$vw, ~mean(.x), .before = .x, .complete = F)) %>%
  bind_cols() %>% 
  bind_cols(df, .) %>% 
  set_names(c("dateday", "latdeg", "londeg", "uw", "vw_day0", paste0("vw_day", 1:3)))

【问题讨论】:

    标签: r slider


    【解决方案1】:

    我们可以在第一个 map 中创建一个 group_split

    library(dplyr)
    library(purrr)
    library(slider)
    map(1:3, ~ df %>%
           group_split(latdeg, londeg) %>%
           map_dbl(function(x) slide_dbl(x$vw, ~ mean(.x, .before = .x,
             .complete = FALSE))))
    

    【讨论】:

    • 谢谢!但是,当我将此函数应用于我的扩展数据集(> 150000 行)时出现错误,我得到的错误是:“错误:结果 1 必须是单个双精度,而不是长度为 378 的双精度向量”。有什么想法吗?
    • @Lee1010 您能否在数据子集而不是整个数据上尝试该函数,看看是否显示错误。如果错误不存在,则可能是向量长度的问题
    【解决方案2】:

    我找到了我的问题的替代答案,这可能有点迟钝但效果很好。

      for(rolldays in 1:3) {
      new_col_name <- paste0("day_", rolldays)
      df <- df %>% 
        group_by(latdeg, londeg) %>% 
        mutate(!!sym(new_col_name) := zoo::rollapplyr(uw, rolldays, mean, fill = NA, na.rm = T)) %>% 
        as.data.frame()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2015-10-07
      • 2021-04-17
      • 1970-01-01
      相关资源
      最近更新 更多