Вы можете использовать split
для расчета C
на id
, например:
df <- structure(list(id = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("p1",
"p2"), class = "factor"), A = c(NA, 5L, NA, NA, NA, 2L, NA),
B = c(2L, 10L, 4L, NA, 2L, 3L, 1L)), row.names = c(NA, -7L
), class = "data.frame")
df$C <- unlist(lapply(split(df, paste(df$id, c(0, head(cumsum(!is.na(df$A)), -1))))
, function(x) {ifelse(is.na(x$A), NA, cumsum(replace(x$B,is.na(x$B),0)))}))
df
# id A B C
#1 p1 NA 2 NA
#2 p1 5 10 12
#3 p1 NA 4 NA
#4 p2 NA NA NA
#5 p2 NA 2 NA
#6 p2 2 3 5
#7 p2 NA 1 NA
или с реальными данными:
df$C <- unlist(lapply(split(df, paste(df$id, c(0, head(cumsum(!is.na(df$A)), -1))))
, function(x) {ifelse(is.na(x$A), NA, cumsum(replace(x$B,is.na(x$B),0)))}))
df
# id time A B C
#1 pair001 6.937567 NA NA NA
#2 pair001 8.604347 NA 1.666780 NA
#3 pair001 11.936991 NA 3.332644 NA
#4 pair001 15.487602 NA 3.550611 NA
#5 pair001 26.987158 NA 11.499556 NA
#6 pair001 28.420643 NA 1.433485 NA
#7 pair001 33.370907 NA 4.950264 NA
#8 pair001 35.487105 NA 2.116198 NA
#9 pair001 40.270437 NA 4.783333 NA
#10 pair001 43.120522 NA 2.850084 NA
#11 pair001 47.153659 NA 4.033137 NA
#12 pair001 51.503537 NA 4.349879 NA
#13 pair001 56.594628 12 5.091090 49.65706
#14 pair001 60.837036 NA 4.242408 NA
#15 pair001 62.570302 NA 1.733266 NA
#16 pair001 64.104403 NA 1.534101 NA
#17 pair001 68.996730 3 4.892327 12.40210
#18 pair001 73.103192 NA 4.106462 NA
#19 pair001 76.453021 NA 3.349829 NA
#20 pair001 78.053259 NA 1.600237 NA
Данные:
df <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "pair001", class = "factor"),
time = c(6.937567, 8.604347, 11.936991, 15.487602, 26.987158,
28.420643, 33.370907, 35.487105, 40.270437, 43.120522, 47.153659,
51.503537, 56.594628, 60.837036, 62.570302, 64.104403, 68.99673,
73.103192, 76.453021, 78.053259), A = c(NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, 12L, NA, NA, NA, 3L, NA, NA,
NA), B = c(NA, 1.66678, 3.332644, 3.550611, 11.499556, 1.433485,
4.950264, 2.116198, 4.783333, 2.850084, 4.033137, 4.349879,
5.09109, 4.242408, 1.733266, 1.534101, 4.892327, 4.106462,
3.349829, 1.600237)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17", "18", "19", "20"))