首页 > 解决方案 > 按组对每 3 个值求和

问题描述

我正在尝试按组对数据框中的 3 个值求和。

例如:

Name Data
A     3
A     5
A     9
A     4
A     3
A     5
A     9
A     4
A     3
A     5
A     9
A     4
B     1
B     5
B     1
B     9

这是我想要的:

Name Data
A     17
A     18
A     16
A     12
A     17
A     18
A     17
A     12
A     17
A     18
A     N/A
A     N/A
B     7
B     15
B     N/A
B     N/A

我正在尝试使用 dplyr 进行此操作,有更好的方法吗?

标签: rdplyr

解决方案


我们可以在按“名称”分组后使用rollsum(from )zoo

library(dplyr)
library(zoo)
df1 %>% 
    group_by(Name) %>%
    mutate(new = rollsum(Data, 3, fill = NA, align = 'left')) %>%
    ungroup

-输出

# A tibble: 16 x 3
   Name   Data   new
   <chr> <int> <int>
 1 A         3    17
 2 A         5    18
 3 A         9    16
 4 A         4    12
 5 A         3    17
 6 A         5    18
 7 A         9    16
 8 A         4    12
 9 A         3    17
10 A         5    18
11 A         9    NA
12 A         4    NA
13 B         1     7
14 B         5    15
15 B         1    NA
16 B         9    NA

或使用frollsumfromdata.table

library(data.table)
setDT(df1)[, new := frollsum(Data, 3, align = 'left'), by = Name]
df1
    Name Data new
 1:    A    3  17
 2:    A    5  18
 3:    A    9  16
 4:    A    4  12
 5:    A    3  17
 6:    A    5  18
 7:    A    9  16
 8:    A    4  12
 9:    A    3  17
10:    A    5  18
11:    A    9  NA
12:    A    4  NA
13:    B    1   7
14:    B    5  15
15:    B    1  NA
16:    B    9  NA

数据

df1 <- structure(list(Name = c("A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "B", "B", "B", "B"), Data = c(3L, 5L, 9L, 
4L, 3L, 5L, 9L, 4L, 3L, 5L, 9L, 4L, 1L, 5L, 1L, 9L)), 
class = "data.frame", row.names = c(NA, 
-16L))

推荐阅读