How can I complete missing values by group?
I have a df with recomendations and ranks, and I need to insert default recomendations when I dont have at least 4 of it.
Input example:
library(tidyverse)
fixed_recomendations <- data.frame(recomendation_id = 50:54, name = paste("recomendation", 50:54, sep = "_"), stringsAsFactors = FALSE)
content_id <- c(1,1,2,rep(3, 6))
rank <- c(1, 2, 1, 1:6)
recomendation_id <- c(1:9)
name <- paste("recomendation", recomendation_id, sep = "_")
df <- data.frame(content_id, rank, recomendation_id, name, stringsAsFactors = FALSE)
# content_id rank recomendation_id name
# 1 1 1 recomendation_1
# 1 2 2 recomendation_2
# 2 1 3 recomendation_3
# 3 1 4 recomendation_4
# 3 2 5 recomendation_5
# 3 3 6 recomendation_6
# 3 4 7 recomendation_7
# 3 5 8 recomendation_8
# 3 6 9 recomendation_9
I have tried to do it with complete/fill but it does not respect the groups and it also cut the values outside of rank range.
df %>%
complete(content_id, rank = 1:4,
fill = list(
recomendation_id = fixed_recomendations$recomendation_id,
name = fixed_recomendations$name
))
# content_id rank recomendation_id name
# 1 1 1 recomendation_1
# 1 2 2 recomendation_2
# 1 3 50 recomendation_50
# 1 4 51 recomendation_51
# 2 1 3 recomendation_3
# 2 2 52 recomendation_52
# 2 3 53 recomendation_53
# 2 4 54 recomendation_54
# 3 1 4 recomendation_4
# 3 2 5 recomendation_5
# 3 3 6 recomendation_6
# 3 4 7 recomendation_7
Desired output:
# content_id rank recomendation_id name
# 1 1 1 recomendation_1
# 1 2 2 recomendation_2
# 1 3 50 recomendation_50
# 1 4 51 recomendation_51
# 2 1 3 recomendation_3
# 2 2 50 recomendation_50
# 2 3 51 recomendation_51
# 2 4 52 recomendation_52
# 3 1 4 recomendation_4
# 3 2 5 recomendation_5
# 3 3 6 recomendation_6
# 3 4 7 recomendation_7
# 3 5 8 recomendation_8
# 3 6 9 recomendation_9
I dont know if this was the best approach, but I ended solving it in two steps, first I create a tibble with NA values using complete, then I filtered the NA values and update it group using split/map_df: