How about using expandinside complete.
library(tidyverse)
complete(df, expand(df, quarter, name, week), fill = list(value=0))
# quarter name week value
# <fct> <fct> <int> <dbl>
# 1 17Q3 abc 1 0.700
# 2 17Q3 abc 2 0
# 3 17Q3 abc 3 0.650
# 4 17Q3 def 1 0.130
# 5 17Q3 def 2 0.0400
# 6 17Q3 def 3 0
Or maybe it’s easier to understand:
df %>% expand(quarter, name, week) %>% left_join(df) %>% replace_na(list(value=0))
source
share