Given the following data set:
df <-
data.frame (
var2kreuz = c(rep(c("AAA"), 8), rep(c("BBB"), 8)),
cohort = c(
rep(c("2012/13"), 3),
rep(c("2013/14"), 2),
rep(c("2014/15"), 3),
rep(c("2012/13"), 2),
rep(c("2013/14"), 3),
rep(c("2014/15"), 3)
),
var2use = c(
"negative",
"neutral",
"positive",
"neutral",
"positive",
"negative",
"neutral",
"positive",
"negative",
"neutral",
"negative",
"neutral",
"positive",
"negative",
"neutral",
"positive"
),
n = round(runif(8, min = 0, max = 101))
)
I now want to check for each group in var2kreuz and each cohort in cohort whether there are results for the three expressions negative, neutral and positive in var2use.
If there are no results for one or more expressions for a cohort, a row is to be added to the data set, e.g. for AAA and cohort 2013/14 or BBB and cohort 2012/13:
AAA in var2kreuz, 2013/14 in cohort , negative in var2use and 0 in n and BBB in var2kreuz, 2012/13 in cohort , positive in var2use and 0 in n.
CodePudding user response:
You can use tidyr::complete:
library(tidyr)
df %>%
complete(nesting(var2kreuz, cohort), var2use,
fill = list(n = 0))
output
# A tibble: 18 × 4
var2kreuz cohort var2use n
<chr> <chr> <chr> <dbl>
1 AAA 2012/13 negative 75
2 AAA 2012/13 neutral 32
3 AAA 2012/13 positive 88
4 AAA 2013/14 negative 0
5 AAA 2013/14 neutral 77
6 AAA 2013/14 positive 73
7 AAA 2014/15 negative 11
8 AAA 2014/15 neutral 10
9 AAA 2014/15 positive 5
10 BBB 2012/13 negative 75
11 BBB 2012/13 neutral 32
12 BBB 2012/13 positive 0
13 BBB 2013/14 negative 88
14 BBB 2013/14 neutral 77
15 BBB 2013/14 positive 73
16 BBB 2014/15 negative 11
17 BBB 2014/15 neutral 10
18 BBB 2014/15 positive 5
CodePudding user response:
merge it with an expand.grid.
merge(df, do.call(expand.grid, lapply(df[1:3], unique)), all=TRUE)
# var2kreuz cohort var2use n
# 1 AAA 2012/13 negative 44
# 2 AAA 2012/13 neutral 101
# 3 AAA 2012/13 positive 93
# 4 AAA 2013/14 negative NA
# 5 AAA 2013/14 neutral 19
# 6 AAA 2013/14 positive 66
# 7 AAA 2014/15 negative 66
# 8 AAA 2014/15 neutral 50
# 9 AAA 2014/15 positive 98
# 10 BBB 2012/13 negative 44
# 11 BBB 2012/13 neutral 101
# 12 BBB 2012/13 positive NA
# 13 BBB 2013/14 negative 93
# 14 BBB 2013/14 neutral 19
# 15 BBB 2013/14 positive 66
# 16 BBB 2014/15 negative 66
# 17 BBB 2014/15 neutral 50
# 18 BBB 2014/15 positive 98
