r - 按组对每 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 进行此操作,有更好的方法吗?
解决方案
我们可以在按“名称”分组后使用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
或使用frollsum
fromdata.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))
推荐阅读
- node.js - 如何根据当前 agg 进行 Elasticsearch Agg 查询?
- swift - Calendar.current.isDate equalTo toGranularity:Calendar.Component.Day 有奇怪的匹配行为
- javascript - 如何添加多个过滤器(Caman.js)?
- javascript - jQuery:从附近元素获取文本内容并打印到模式标题
- python - 抽象类中的递归 - Python
- javascript - 单击谷歌下拉项目时触发警报
- python - 使用 numpy.roll 对例程进行矢量化
- magento2 - 1 x Magento 2.2.x 多存储多域不工作
- c# - 为什么从投影创建的整数变量不能递增?
- github - Github 算不算持续集成?如果不是,Github 和持续集成有什么区别?