You can try
df$group <- as.character(df$group) setDT(df)[, .SD[1:(.N+1)], by=group][is.na(xvalue), group:=NA][!.N] # group xvalue yvalue #1: a 16 1 #2: NA NA NA #3: b 17 2 #4: b 18 3 #5: NA NA NA #6: c 19 4 #7: c 20 5 #8: c 21 6 #9: NA NA NA #10: d 22 7 #11: d 23 8 #12: d 24 9 #13: d 25 10
Or as suggested by @David Arenburg
setDT(df)[, indx := group][, .SD[1:(.N+1)], indx][,indx := NULL][!.N]
or
setDT(df)[df[,.I[1:(.N+1)], group]$V1][!.N]
Or it can be further simplified based on @eddi's comments
setDT(df)[df[, c(.I, NA), group]$V1][!.N]
akrun
source share