I am trying to add a row of NAs after each group of data in R
.
A similar question has been asked earlier. Insert a blank row after each group of data.
One way I could think of is to construct a vector first as follows:
foo <- function(x) {
o = order(rep.int(seq_along(x), 2L))
c(x, rep.int(NA, length(x)))[o]
}
join_values = head(foo(unique(df_new$group)), -1L)
# [1] "a" NA "b" NA "c" NA "d"
And then setkey()
and join
.
setkey(setDT(df_new), group)
df_new[.(join_values), allow.cartesian=TRUE]
# 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
You could 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 could be further simplified based on @eddi's comments
setDT(df)[df[, c(.I, NA), group]$V1][!.N]