【问题标题】:Sum column values over a window and report the values of the previous window对一个窗口的列值求和并报告前一个窗口的值
【发布时间】:2020-07-27 16:12:18
【问题描述】:

我有一个如下形式的 data.frame:

ID  Var1   
1    1 
1    1
1    3
1    4
1    1
1    0
2    2
2    2
2    6
2    7
2    8
2    0
3    0
3    2
3    1
3    3
3    2
3    4

我想去那里:

ID  Var1  X  
1    1    0
1    1    0
1    3    0
1    4    5
1    1    5
1    0    5
2    2    0 
2    2    0
2    6    0
2    7    10
2    8    10
2    0    10
3    0    0
3    2    0
3    1    0
3    3    3
3    2    3
3    4    3

言下之意:我想计算window = 3 中变量的总和,然后报告在上一个窗口中获得的结果。这应该发生在IDs 上,因此每个ID 的前三个观察值应该返回0,因为没有可以报告的先前时间段。 为了理解:在实际数据集中,每一行对应一个星期和window = 7。所以 X 应该提供关于前一周 Var1 总和的信息。

我尝试使用一些rollapply 的东西,但总是以错误结束,而且如果我做对了,窗口也会是滚动窗口,这特别不是我需要的。

感谢您的回答!

【问题讨论】:

    标签: r plyr zoo rollapply


    【解决方案1】:

    rollapply 中,宽度参数可以是提供要使用的偏移量的列表。在这种情况下,我们希望将点 3、2 和 1 用于第一个点,将 4、3 和 2 用于第二个点,将 5、4 和 3 点用于第三个点,然后循环使用。也就是说,对于 k = 3 的窗口宽度,我们需要以下偏移向量列表:

    w <- list(-(3:1), -(4:2), -(5:3))
    

    一般情况下,我们可以用窗口宽度 k 在下面写wave 然后使用每个 ID 的宽度列表调用 rollapply

    library(zoo)
    
    k <- 3
    w <- lapply(1:k, function(x) seq(to = -x, length = k))
    transform(DF, X = ave(Var1, ID, FUN = function(x) rollapply(x, w, sum, fill = 0)))
    

    给予:

       ID Var1  X
    1   1    1  0
    2   1    1  0
    3   1    3  0
    4   1    4  5
    5   1    1  5
    6   1    0  5
    7   2    2  0
    8   2    2  0
    9   2    6  0
    10  2    7 10
    11  2    8 10
    12  2    0 10
    13  3    0  0
    14  3    2  0
    15  3    1  0
    16  3    3  3
    17  3    2  3
    18  3    4  3
    

    注意

    可重现形式的输入DF 是:

    DF <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
      2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), Var1 = c(1L, 1L, 3L, 4L, 1L, 
      0L, 2L, 2L, 6L, 7L, 8L, 0L, 0L, 2L, 1L, 3L, 2L, 4L)), 
      class = "data.frame", row.names = c(NA, -18L))
    

    【讨论】:

    • 感谢您的回答,但我是否正确:您的方法仅适用于图片数据框?实际数据框有 ~ 33.000 行,因此为所有这些定义“w”
    • w 是根据 k 定义的,因此 k 可以设置为任何值,例如 3 或 7,并且数据框中的行数可以是任何值。如答案和 rollapply 帮助文件中所述,偏移量回收到所需的长度。
    • 对不起,这里是 R 初学者。功能运行良好!
    【解决方案2】:

    我们可以按“ID”分组,使用gl 创建一个窗口大小为3 的新分组列,然后通过获取“Var1”的sum 并将“Var1”放入一个list,得到'X'的lagunnest

    library(dplyr) #1.0.0    
    library(tidyr)    
    df1 %>%
         # // grouping by ID
         group_by(ID) %>%
         # // create another group added with gl
         group_by(grp = as.integer(gl(n(), 3, n())), .add = TRUE) %>% 
         # // get the sum of Var1, while changing the Var1 in a list
         summarise(X = sum(Var1), Var1 = list(Var1)) %>%
         # // get the lag of X
         mutate(X = lag(X, default = 0)) %>% 
         # // unnest the list column
         unnest(c(Var1)) %>%
         select(names(df1), X)
    # A tibble: 18 x 3
    # Groups:   ID [3]
    #      ID  Var1     X
    #   <int> <int> <dbl>
    # 1     1     1     0
    # 2     1     1     0
    # 3     1     3     0
    # 4     1     4     5
    # 5     1     1     5
    # 6     1     0     5
    # 7     2     2     0
    # 8     2     2     0
    # 9     2     6     0
    #10     2     7    10
    #11     2     8    10
    #12     2     0    10
    #13     3     0     0
    #14     3     2     0
    #15     3     1     0
    #16     3     3     3
    #17     3     2     3
    #18     3     4     3
    

    数据

    df1 <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
    2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), Var1 = c(1L, 1L, 3L, 4L, 1L, 
    0L, 2L, 2L, 6L, 7L, 8L, 0L, 0L, 2L, 1L, 3L, 2L, 4L)), class = "data.frame",
    row.names = c(NA, 
    -18L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多