为缺少的日期创建包含groupby列的新行

时间:2018-05-08 14:47:34

标签: r row

其他人询问如何使用complete函数来填补空白,但我希望将其他几个列分组,然后填写缺失的日期。

我有一个包含许多列的数据框,为简单起见,我只显示4列这样的

data <- data.frame(groups = c('A', 'A','A','A','A','A','A','A','A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'),
                   date = c(6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535),
                   days = c(1, 2, 4, 7, 11, 12, 13, 14, 15, 1, 3, 4, 5, 6, 9, 10, 12, 13, 14),
                   price = c(64, 82, 31, 77, 21, 39, 79, 67, 45, 66, 24, 60, 64, 56, 41, 29, 60, 57, 68))

我想为缺少的日子创建新行,以便我得到一个像这样的表

   groups date days price
1       A 6535    1    64
2       A 6535    2    82
3       A 6535    3    NA
4       A 6535    4    31
5       A 6535    5    NA
6       A 6535    6    NA
7       A 6535    7    77
8       A 6535    8    NA
9       A 6535    9    NA
10      A 6535   10    NA
11      A 6535   11    21
12      A 6535   12    39
13      A 6535   13    79
14      A 6535   14    67
15      A 6535   15    45
16      B 6535    1    66
17      B 6535    2    NA
18      B 6535    3    24
19      B 6535    4    60
20      B 6535    5    64
21      B 6535    6    56
22      B 6535    7    NA
23      B 6535    8    NA
24      B 6535    9    41
25      B 6535   10    29
26      B 6535   11    NA
27      B 6535   12    60
28      B 6535   13    57
29      B 6535   14    68
30      B 6535   15    NA

因此,我希望按groupsdate进行分组,然后浏览days列(范围为1到15)并添加一行,用于复制行的缺失日期基于groups的{​​{1}}和dategroup by列的值为price

1 个答案:

答案 0 :(得分:2)

查看名为tidyr

complete函数
library(dplyr)
library(tidyr)
data %>% group_by(date,groups) %>% complete(days = 1:15)


# # A tibble: 30 x 4
# # Groups: date, groups [2]
#     date groups  days price
#    <dbl> <fct>  <dbl> <dbl>
#  1  6535 A       1.00  64.0
#  2  6535 A       2.00  82.0
#  3  6535 A       3.00  NA  
#  4  6535 A       4.00  31.0
#  5  6535 A       5.00  NA  
#  6  6535 A       6.00  NA  
#  7  6535 A       7.00  77.0
#  8  6535 A       8.00  NA  
#  9  6535 A       9.00  NA  
# 10  6535 A      10.0   NA  
# # ... with 20 more rows