setDT(dt)
dt[, occ := 1:.N, by = .(Company, TimePeriod, IndividualID)]
dt[, n := cumsum(!duplicated(IndividualID)), by = .(Company, TimePeriod)]
dt[, Value1 := Value,]
dt[, x := c(0, diff(Value)), by = .(Company, TimePeriod, IndividualID)]
dt[occ>1, Value1 := x,]
dt[, Cummean := cumsum(Value1)/n, by = .(Company, TimePeriod)]
dt[, c("occ", "n", "Value1", "x") := NULL][]
# Company TimePeriod IndividualID Date.Indiv.Acted Value Cummean
# 1: 1 2015 A 2015-01-01 400 400
# 2: 1 2015 B 2015-02-01 200 300
# 3: 1 2015 A 2015-06-15 400 300
# 4: 1 2015 C 2015-07-12 300 300
# 5: 1 2016 A 2016-07-15 400 400
# 6: 1 2016 B 2016-08-09 100 250
# 7: 1 2016 C 2016-09-10 400 300
# 8: 1 2016 A 2016-10-11 100 200
# 9: 2 2004 A 2004-07-12 200 200
#10: 2 2004 B 2004-08-12 300 250
dt <- structure(list(Company = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2), TimePeriod = c(2015,
2015, 2015, 2015, 2016, 2016, 2016, 2016, 2004, 2004), IndividualID = c("A",
"B", "A", "C", "A", "B", "C", "A", "A", "B"), Date.Indiv.Acted = c("2015-01-01",
"2015-02-01", "2015-06-15", "2015-07-12", "2016-07-15", "2016-08-09",
"2016-09-10", "2016-10-11", "2004-07-12", "2004-08-12"), Value = c(400,
200, 400, 300, 400, 100, 400, 100, 200, 300)), row.names = c(NA,
-10L), class = "data.frame")