Я не уверен, что полностью понял расчеты. Я думаю, это то, что вы ищете.
library(tidyverse)
df <-
data.frame(stringsAsFactors=FALSE,
species = c("AL", "AL", "AL", "AL", "AL", "AL", "AL", "AA", "AA", "AA",
"AL", "AL", "AA", "AA", "AA", "AA", "AL", "AL"),
population = c("yu", "yu", "yu", "ti", "ti", "ti", "ti", "dla", "dla",
"dla", "yu", "yu", "mra", "mra", "yu", "yu", "bz", "bz"),
individual = c(1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 1, 2, 1, 2, 1, 2),
pathogen = c("dv", "dv", "dv", "dv", "dv", "dv", "dv", "dv", "dv", "dv",
"zk", "zk", "zk", "zk", "yv", "yv", "zk", "zk"),
dpi = c(21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 14, 14, 21,
21, 14, 14),
infect = c(1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1),
dissem = c(1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1),
trans = c(1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, NA, NA, 0, 0, NA, NA),
st = c(220, 100, 0, 0, 60, 0, 0, 180, 0, 360, 0, 0, NA, NA, 0, 0,
NA, NA)
)
# infectrate = (number positif/number of individuals tested)*100;
# dissemrate = (number positif$dissem/number positif$infect)*100;
# transrate = (number positif$trans/number positif$dissem)*100;
# strate = mean($st);
df %>%
group_by(species, population, pathogen, dpi) %>%
summarise(
infectrate = sum(infect)/n()*100,
dissemrate = ifelse(infectrate == 0, 0, sum(dissem)/sum(infect)*100),
transrate = ifelse(dissemrate == 0, 0, sum(trans)/sum(dissem)*100),
strate = mean(st)
) %>%
ungroup()
#> df
# A tibble: 7 x 8
# species population pathogen dpi infectrate dissemrate transrate strate
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 AA dla dv 21 100 100 66.7 180
#2 AA mra zk 14 100 100 NA NA
#3 AA yu yv 21 50 100 0 0
#4 AL bz zk 14 100 100 NA NA
#5 AL ti dv 21 50 100 50 15
#6 AL yu dv 21 66.7 100 100 107.
#7 AL yu zk 21 0 0 0 0