首页 > 解决方案 > 在 R DataFrame 中一起添加日期和名称

问题描述

我正在尝试在 R 中创建滚动平均值计算,但我只有某个范围内某些日期的数据。但是,与其在滚动平均计算中完全忽略没有数据的日期,我希望在滚动平均计算中将没有数据的日期计为 0。

我创建了一个示例数据框来演示,但在我的实际数据集中,我显然有更多的日期和名称。此外,我正在尝试找出一种方法来将名称添加到每天为 0 时添加的位置。

这是示例 DF 的代码

Date <- Date <- as.Date(c('2021-01-01','2021-01-01','2021-01-01', '2021-01-03','2021-01-03','2021-01-03', '2021-01-04','2021-01-04','2021-01-04', '2021-02-02','2021-02-02','2021-02-02', '2021-02-03','2021-02-03','2021-02-03', '2021-03-01','2021-03-01','2021-03-01'))
Name <- c("John Smith", "Jane Peters", "Jim Clark","John Smith", "Jane Peters", "Jim Clark","John Smith", "Jane Peters", "Jim Clark","John Smith", "Jane Peters", "Jim Clark","John Smith", "Jane Peters", "Jim Clark","John Smith", "Jane Peters", "Jim Clark")
Hours <- c(floor(runif(18, min=0, max = 14)))
data.frame(Date, Name, Hours)

上面的数据框看起来像这样

         Date        Name Hours
1  2021-01-01  John Smith    11
2  2021-01-01 Jane Peters     9
3  2021-01-01   Jim Clark     6
4  2021-01-03  John Smith     7
5  2021-01-03 Jane Peters     1
6  2021-01-03   Jim Clark     9
7  2021-01-04  John Smith     2
8  2021-01-04 Jane Peters     4
9  2021-01-04   Jim Clark    10
10 2021-02-02  John Smith     2
11 2021-02-02 Jane Peters     1
12 2021-02-02   Jim Clark     3
13 2021-02-03  John Smith     8
14 2021-02-03 Jane Peters     7
15 2021-02-03   Jim Clark     0
16 2021-03-01  John Smith    11
17 2021-03-01 Jane Peters     6
18 2021-03-01   Jim Clark     8

为了说明,我想为没有数据的每个人添加一个“小时”为 0 的每一天。

最终结果在 1 月的前几天看起来像这样,但会一直持续到 3 月初的结束日期。

1  2021-01-01  John Smith    11
2  2021-01-01 Jane Peters     9
3  2021-01-01   Jim Clark     6
4  2021-01-02  John Smith     0
5  2021-01-02 Jane Peters     0
6  2021-01-02   Jim Clark     0
4  2021-01-03  John Smith     7
5  2021-01-03 Jane Peters     1
6  2021-01-03   Jim Clark     9
7  2021-01-04  John Smith     2
8  2021-01-04 Jane Peters     4
9  2021-01-04   Jim Clark    10
10 2021-01-05  John Smith     0
11 2021-01-05 Jane Peters     0
12 2021-01-05   Jim Clark     0

这样,我将能够将没有数据的天数作为 0 添加到我的滚动平均值计算中。

标签: rdataframedate

解决方案


听起来您正在寻找该tidyr::complete功能。看起来像这样

library(tidyr)
complete(mydata, Date=seq(min(Date), max(Date), by="1 day"), Name, fill=list(Hours=0))

推荐阅读