Из того, что я понимаю, вы можете сделать следующее
library(data.table)
dt <- fread(text)
dt[, .(C = diff(range(C))), by = .(grp = rleid(is.na(C)))]
# grp C
#1: 1 NA
#2: 2 5
#3: 3 NA
#4: 4 7
Для B
и C
одновременно сделать
dt[, lapply(.SD, function(x) diff(range(x))), by = .(grp = rleid(is.na(C))), .SDcols = c('B', 'C')]
# grp B C
#1: 1 1 NA
#2: 2 NA 5
#3: 3 7 NA
#4: 4 NA 7
Другой вариант удалить NA
s
cols <- c('B', 'C')
out <- dt[, lapply(.SD, function(x) diff(range(x))), by = rleid(is.na(C)), .SDcols = cols
][, lapply(.SD, na.omit), .SDcols = cols
][, grp := rleid(B)]
out
# B C grp
#1: 1 5 1
#2: 7 7 2
Обратите внимание, что второе и третье решения предполагают, что B
равно NA
, когда C
не наоборот,
данные
text <- "A B C
Cat1 1 NA
Cat1 2 NA
Cat1 1 NA
Cat1 2 NA
Cat1 NA 4
Cat1 NA 1
Cat1 NA 6
Cat1 NA 4
Cat1 7 NA
Cat1 9 NA
Cat1 3 NA
Cat1 2 NA
Cat1 NA 2
Cat1 NA 4
Cat1 NA 5
Cat1 NA 9"