Одним из способов является объединение / объединение комбинаций обратно в данные.(Я немного изменил данные, чтобы их было легко скопировать / вставить здесь в SO.)
dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
Sample Observation Percent
A Y 50
A N 50
B Y 10
B N 80
B Don_t_know 10 ')
База R
merge(
dat,
expand.grid(Sample = unique(dat$Sample),
Observation = unique(dat$Observation),
stringsAsFactors = FALSE),
by = c("Sample", "Observation"),
all = TRUE
)
# Sample Observation Percent
# 1 A Don_t_know NA
# 2 A N 50
# 3 A Y 50
# 4 B Don_t_know 10
# 5 B N 80
# 6 B Y 10
Tidyverse:
library(dplyr)
library(tidyr)
dat %>%
full_join(
crossing(Sample = unique(dat$Sample), Observation = unique(dat$Observation)),
by = c("Sample", "Observation")
)
# Sample Observation Percent
# 1 A Y 50
# 2 A N 50
# 3 B Y 10
# 4 B N 80
# 5 B Don_t_know 10
# 6 A Don_t_know NA
или даже
dat %>%
full_join(expand(., Sample, Observation))
# Joining, by = c("Sample", "Observation")
# Sample Observation Percent
# 1 A Y 50
# 2 A N 50
# 3 B Y 10
# 4 B N 80
# 5 B Don_t_know 10
# 6 A Don_t_know NA