Вы можете присоединиться к таблице, содержащей контрольные значения:
library(data.table)
setDT(DF)
DF[
DF[Treatment == "control", .(Year, c_value = value)],
on=.(Year),
d := value - c_value
][]
# or
library(dplyr)
left_join(DF,
DF %>% filter(Treatment == "control") %>% select(Year, c_value = value)
) %>% mutate(d = value - c_value) %>% select(-c_value)
Способ data.table изменяет DF, в то время как dplyr создает новую таблицу.
Используемые данные:
DF = structure(list(ID = c(1L, 1L, 2L, 2L), Year = c(2010L, 2011L,
2010L, 2011L), Species = c("x", "x", "x", "x"), Treatment = c("control",
"control", "MaxDamage", "MaxDamage"), value = c(0.04, 0.1, 0.02,
0.06)), .Names = c("ID", "Year", "Species", "Treatment", "value"
), row.names = c(NA, -4L), class = "data.frame")