I have the following data example:
df1 <- tibble(V1 = c("a", "b", "c"),
V2 = c("b", "b", "f"),
v3 = c(1:3))
I would like to generate this output from the df1:
# A tibble: 16 × 3
V1 V2 v3
<chr> <chr> <dbl>
1 a b 1
2 b b 2
3 c f 3
4 a a 0
5 a c 0
6 a f 0
7 b a 0
8 b c 0
9 b f 0
10 c a 0
11 c b 0
12 c c 0
13 f a 0
14 f b 0
15 f c 0
16 f f 0
I try it, but not works:
df1 %>% complete(V1, V2,
fill = list(V3 = 0))
Thanks all
CodePudding user response:
We may need to add the levels - convert the columns 'V1', 'V2' to factor
with levels
specified as the unique
levels from both the columns, and then use complete
library(dplyr)
library(tidyr)
lvls <- sort(unique(unlist(df1[1:2])))
df1 %>%
complete(V1 = factor(V1, levels = lvls),
V2 = factor(V2, levels = lvls),
fill = list(v3 = 0)) %>%
arrange(v3 == 0)
-output
# A tibble: 16 × 3
V1 V2 v3
<chr> <chr> <int>
1 a b 1
2 b b 2
3 c f 3
4 a a 0
5 a c 0
6 a f 0
7 b a 0
8 b c 0
9 b f 0
10 c a 0
11 c b 0
12 c c 0
13 f a 0
14 f b 0
15 f c 0
16 f f 0
CodePudding user response:
tidyr::expand() solves this. It can be used for multiple column combinations