Мы можем использовать replace
:
setDT(data1)
data1[, X := replace(X, is.na(X), X[Time == 3]), .(ID, Day)]
# ID Day Time X
# 1: 1 1 1 7.4
# 2: 1 1 2 7.4
# 3: 1 1 3 7.4
# 4: 1 2 1 6.2
# 5: 1 2 3 6.2
# 6: 2 1 1 7.1
# 7: 2 1 2 7.1
# 8: 2 1 3 7.1
# 9: 2 2 3 5.9
#10: 2 2 2 5.9
#11: 2 2 1 5.9
Аналогично, используя dplyr
.
library(dplyr)
data1 %>% group_by(ID, Day) %>% mutate(X =replace(X, is.na(X), X[Time == 3]))
Если у вас более 1 значения в группе, где Time == 3
используется which.max
data1[, X := replace(X, is.na(X), X[which.max(Time == 3)]), .(ID, Day)]
Если для Time == 3
нет значения, мы можем использовать:
data1[, X := if(any(Time == 3)) replace(X, is.na(X), X[which.max(Time == 3)]), .(ID, Day)]