在多列上使用 tidyr::complete

use tidyr::complete on multiple columns

我几乎可以肯定我可以使用 tidyr::complete 来填充缺失的记录,但是我无法通过使用 expandnesting 使其正常工作。我还没有找到任何非常有帮助的例子。我对单列使用 complete,但从未使用多个。

我有一个包含 groupsubgrouplow_endhigh_end 的数据集。低位和高位 始终 相差 5。对于 groupsubgrouplow_end+high_end 组合的每个可能配对,我至少需要数据中的 1 条记录。并非 low_endhigh_end 的所有可能组合都将出现在数据中(在此 reprex 20/25 中)。

df <- data.frame(
  group = c(rep('A', 2), rep('B', 2), rep('C', 1)),
  subgroup = c(1,2,2,2,1),
  low_end = c(5, 10, 10, 15, 25),
  high_end = c(10, 15, 15, 20, 30),
  value = c(rep(99, 5))
)
  group subgroup low_end high_end value
1     A        1       5       10    99
2     A        2      10       15    99
3     B        2      10       15    99
4     B        2      15       20    99
5     C        1      25       30    99

期望输出:

desired_result <- data.frame(
  group = c(rep('A', 10), rep('B', 10), rep('C', 10)),
  subgroup = c(rep(1, 5), rep(2, 5), rep(1, 5), rep(2, 5), rep(1, 5), rep(2, 5)),
  low_end = c(rep(full_seq(x=c(5,25), 5), 6)),
  high_end = c(rep(full_seq(x=c(10,30), 5), 6)),
  value = c(99, rep(NA, 5), 99, rep(NA, 9), 99, 99, rep(NA, 6), 99, rep(NA, 5))
  )
   group subgroup low_end high_end value
1      A        1       5       10    99
2      A        1      10       15    NA
3      A        1      15       20    NA
4      A        1      20       25    NA
5      A        1      25       30    NA
6      A        2       5       10    NA
7      A        2      10       15    99
8      A        2      15       20    NA
9      A        2      20       25    NA
10     A        2      25       30    NA
11     B        1       5       10    NA
12     B        1      10       15    NA
13     B        1      15       20    NA
14     B        1      20       25    NA
15     B        1      25       30    NA
16     B        2       5       10    NA
17     B        2      10       15    99
18     B        2      15       20    99
19     B        2      20       25    NA
20     B        2      25       30    NA
21     C        1       5       10    NA
22     C        1      10       15    NA
23     C        1      15       20    NA
24     C        1      20       25    NA
25     C        1      25       30    99
26     C        2       5       10    NA
27     C        2      10       15    NA
28     C        2      15       20    NA
29     C        2      20       25    NA
30     C        2      25       30    NA

文档说要使用 expand 来包含数据中缺失的值,所以我认为它必须接近于...

attempt <- df %>%
  complete(expand(group, subgroup, low_end, high_end), fill= NA)

但是,我显然遗漏了一些重要的东西。

我们可以在 nesting

中执行 seq
library(dplyr)
library(tidyr)
df %>% 
    complete(group, subgroup, nesting(low_end = seq(min(low_end), 
        max(low_end), by = 5), 
       high_end = seq(min(high_end), max(high_end), by = 5)))

-输出

# A tibble: 30 x 5
#   group subgroup low_end high_end value
#   <chr>    <dbl>   <dbl>    <dbl> <dbl>
# 1 A            1       5       10    99
# 2 A            1      10       15    NA
# 3 A            1      15       20    NA
# 4 A            1      20       25    NA
# 5 A            1      25       30    NA
# 6 A            2       5       10    NA
# 7 A            2      10       15    99
# 8 A            2      15       20    NA
# 9 A            2      20       25    NA
#10 A            2      25       30    NA
# … with 20 more rows