Kev*_*n M 3 r missing-data dplyr
我有一个数据框,有两列,我正在分组dplyr,一列数月(如数字,例如1到12),以及几个列后面有统计数据(值不重要).一个例子:
ID_1 ID_2 month st1 st2
1 1 1 0.5 0.2
1 1 2 0.7 0.9
1 1 3 1.1 1.7
1 1 4 2.6 0.8
1 1 5 1.8 1.3
1 1 6 2.1 2.2
1 1 7 0.5 0.2
1 1 8 0.7 0.9
1 1 9 1.1 1.7
1 1 10 2.6 0.8
1 1 11 1.8 1.3
1 1 12 2.1 2.2
1 2 1 0.5 0.2
1 2 2 0.7 0.9
1 2 3 1.1 1.7
1 2 4 2.6 0.8
1 2 5 1.8 1.3
1 2 6 2.1 2.2
1 2 7 0.5 0.2
1 2 9 1.1 1.7
1 2 10 2.6 0.8
1 2 11 1.8 1.3
1 2 12 2.1 2.2
Run Code Online (Sandbox Code Playgroud)
对于第二个分组(ID_1 = 1和ID_2 = 2),数据(month = 8)中缺少一个月.有没有一种方法,我可以找到这个月并插入一个一行用正确的ID_1和ID_2值,遗漏month值,和NA值列的休息吗?我一直在玩这个使用dplyr功能,似乎无法弄明白,也许甚至还有一个非dplyr解决方案.
PS:如果它有帮助,每个独特的分组ID_1和ID_2将不会超过1个月失踪.
展开网格以组合所有组合,然后合并:
# make reference with all needed rows
ref <- data.frame(expand.grid(unique(df1$ID_1),
unique(df1$ID_2),
1:12))
colnames(ref) <- colnames(df1)[1:3]
# them merge with all TRUE
res <- merge(df1, ref, all = TRUE)
# to check output, show only month = 8
res[ res$month == 8, ]
# ID_1 ID_2 month st1 st2
# 8 1 1 8 0.7 0.9
# 20 1 2 8 NA NA
Run Code Online (Sandbox Code Playgroud)
这可以通过tidyr::complete以下方式完成:
library(dplyr)
library(tidyr)
dat %>%
group_by(ID_1, ID_2) %>%
complete(month = 1:12)
Run Code Online (Sandbox Code Playgroud)
数据集尾:
Source: local data frame [6 x 5]
Groups: ID_1, ID_2 [1]
ID_1 ID_2 month st1 st2
<int> <int> <int> <dbl> <dbl>
1 1 2 7 0.5 0.2
2 1 2 8 NA NA
3 1 2 9 1.1 1.7
4 1 2 10 2.6 0.8
5 1 2 11 1.8 1.3
6 1 2 12 2.1 2.2
Run Code Online (Sandbox Code Playgroud)