Мы можем сгруппировать по Pair.ID, указать логический вектор в i
, т. Е. Там, где есть не-NA элементы в «laydate», и создать новый столбец «опыт», задав (:=
) последовательность строк
library(data.table)
setDT(df1)[!is.na(laydate), experience := seq_len(.N) - 1, Pair.ID][]
# Pair.ID laydate experience
# 1: GGM 022 <NA> NA
# 2: GGM 022 <NA> NA
# 3: GGM 022 <NA> NA
# 4: GGM 019 26/03/2017 0
# 5: GGM 019 <NA> NA
# 6: GGM 019 <NA> NA
# 7: GGM 013 18/03/2017 0
# 8: GGM 021 <NA> NA
# 9: GGM 021 <NA> NA
#10: GGM 021 <NA> NA
#11: GGM 009 25/12/2016 0
#12: GGM 009 14/01/2019 1
#13: GGM 009 20/01/2019 2
#14: GGM 029 <NA> NA
#15: GGM 031 09/05/2019 0
#16: GGM 031 19/06/2019 1
Или с dplyr
library(dplyr)
df1 %>%
group_by(Pair.ID) %>%
mutate(experience = (row_number()-1) * (NA^(is.na(laydate))))
data
df1 <- structure(list(Pair.ID = c("GGM 022", "GGM 022", "GGM 022", "GGM 019",
"GGM 019", "GGM 019", "GGM 013", "GGM 021", "GGM 021", "GGM 021",
"GGM 009", "GGM 009", "GGM 009", "GGM 029", "GGM 031", "GGM 031"
), laydate = c(NA, NA, NA, "26/03/2017", NA, NA, "18/03/2017",
NA, NA, NA, "25/12/2016", "14/01/2019", "20/01/2019", NA, "09/05/2019",
"19/06/2019")), class = "data.frame", row.names = c("1", "2",
"3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14",
"15", "16"))