R 按组填写缺失的日期
在我的数据中,有些ID在几个月内存在观察结果,而其他ID则没有,例如R 按组填写缺失的日期,r,dplyr,missing-data,R,Dplyr,Missing Data,在我的数据中,有些ID在几个月内存在观察结果,而其他ID则没有,例如 dat <- data.frame(c(1, 1, 1, 2, 3, 3, 3, 4, 4, 4), c(rep(30, 2), rep(25, 5), rep(20, 3)), c('2017-01-01', '2017-02-01', '2017-04-01', '2017-02-01', '2017-01-01', '2017-02-01', '2017-03-01', '2017-01-01',
dat <- data.frame(c(1, 1, 1, 2, 3, 3, 3, 4, 4, 4), c(rep(30, 2), rep(25, 5), rep(20, 3)), c('2017-01-01', '2017-02-01', '2017-04-01', '2017-02-01', '2017-01-01', '2017-02-01', '2017-03-01', '2017-01-01',
'2017-02-01', '2017-04-01'))
colnames(dat) <- c('id', 'value', 'date')
dattidyr::complete()
适用于给定示例数据的情况:
library(tidyverse)
dat %>%
group_by(id) %>%
complete(date) %>%
ungroup()
id date value
<dbl> <fct> <dbl>
1 1.00 2017-01-01 30.0
2 1.00 2017-02-01 30.0
3 1.00 2017-03-01 NA
4 1.00 2017-04-01 25.0
5 2.00 2017-01-01 NA
6 2.00 2017-02-01 25.0
7 2.00 2017-03-01 NA
8 2.00 2017-04-01 NA
9 3.00 2017-01-01 25.0
10 3.00 2017-02-01 25.0
11 3.00 2017-03-01 25.0
12 3.00 2017-04-01 NA
13 4.00 2017-01-01 20.0
14 4.00 2017-02-01 20.0
15 4.00 2017-03-01 NA
16 4.00 2017-04-01 20.0
库(tidyverse)
dat%>%
分组依据(id)%>%
完成日期%>%
解组()
id日期值
1 1.00 2017-01-01 30.0
2 1.00 2017-02-01 30.0
3 1.00 2017-03-01北美
4 1.00 2017-04-01 25.0
5.2.00 2017-01-01不适用
6 2.00 2017-02-01 25.0
7.2.00 2017-03-01北美
8.2.00 2017-04-01北美
9 3.00 2017-01-01 25.0
10 3.00 2017-02-01 25.0
11 3.00 2017-03-01 25.0
12.3.00 2017-04-01北美
13 4.00 2017-01-01 20.0
14 4.00 2017-02-01 20.0
15.4.00 2017-03-01北美
16 4.00 2017-04-01 20.0
这里有一种方法可以使用展开.grid
和合并:
dat <- data.frame(c(1, 1, 1, 2, 3, 3, 3, 4, 4, 4), c(rep(30, 2), rep(25, 5), rep(20, 3)), as.Date(c('2017-01-01', '2017-02-01', '2017-04-01', '2017-02-01', '2017-01-01', '2017-02-01', '2017-03-01', '2017-01-01',
'2017-02-01', '2017-04-01')))
colnames(dat) <- c('id', 'value', 'date')
date_range <- seq(min(as.Date(dat$date)), max(as.Date(dat$date)), by = 'months')
dat_expanded <- expand.grid(date_range, dat$id)
colnames(dat_expanded) <- c("date", "id")
result <- merge(dat, dat_expanded, by=c("id", "date"), all.y = T)
dattidyr::complete()
填充缺少的值
添加id
和date
作为要展开的列(…
)
library(tidyverse)
complete(dat, id, date)
# A tibble: 16 x 3
id date value
<dbl> <date> <dbl>
1 1.00 2017-01-01 30.0
2 1.00 2017-02-01 30.0
3 1.00 2017-03-01 NA
4 1.00 2017-04-01 25.0
5 2.00 2017-01-01 NA
6 2.00 2017-02-01 25.0
7 2.00 2017-03-01 NA
8 2.00 2017-04-01 NA
9 3.00 2017-01-01 25.0
10 3.00 2017-02-01 25.0
11 3.00 2017-03-01 25.0
12 3.00 2017-04-01 NA
13 4.00 2017-01-01 20.0
14 4.00 2017-02-01 20.0
15 4.00 2017-03-01 NA
16 4.00 2017-04-01 20.0
库(tidyverse)
完成(日期、id、日期)
#一个tibble:16 x 3
id日期值
1 1.00 2017-01-01 30.0
2 1.00 2017-02-01 30.0
3 1.00 2017-03-01北美
4 1.00 2017-04-01 25.0
5.2.00 2017-01-01不适用
6 2.00 2017-02-01 25.0
7.2.00 2017-03-01北美
8.2.00 2017-04-01北美
9 3.00 2017-01-01 25.0
10 3.00 2017-02-01 25.0
11 3.00 2017-03-01 25.0
12.3.00 2017-04-01北美
13 4.00 2017-01-01 20.0
14 4.00 2017-02-01 20.0
15.4.00 2017-03-01北美
16 4.00 2017-04-01 20.0
这就是您想要的吗?这是可行的,但它比需要的要复杂一些。您只需提供id
和date
作为列,以便在complete
中展开,并避免分组和取消分组。