For example, the result should have a column named blank:
blankdf <- function(x) data.frame(blank = numeric(0)) dat <- data.frame(a = 1:2, b = factor(1:2)) dat %>% group_by(b) %>% do(blankdf(.)) # Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 0 obs. of 1 variable: # $ b: Factor w/ 2 levels "1","2": # - attr(*, "vars")=List of 1 # ..$ : symbol b # - attr(*, "drop")= logi TRUE # - attr(*, "indices")= list() # - attr(*, "group_sizes")= int # - attr(*, "biggest_group_size")= int 0 # - attr(*, "labels")='data.frame': 0 obs. of 1 variable: # ..$ b: Factor w/ 2 levels "1","2": # ..- attr(*, "vars")=List of 1 # .. ..$ : symbol b
Also, if the input has zero-rows but is grouped there is an error:
data.frame(a = numeric(0), b = factor()) %>% group_by(b) %>% do(blankdf(.)) # Error in rep(1:nrow(labels), rows) : invalid 'times' argument data.frame(a = numeric(0), b = character()) %>% group_by(b) %>% do(blankdf(.)) # Error in rep(1:nrow(labels), rows) : invalid 'times' argument
However, if the input originally had more rows but now has zero, it doesn't error (but it still drops the blank column):
dat <- data.frame(a = 1:2, b = factor(1:2)) dat2 <- dat %>% group_by(b) dat2 <- dat2[0,] dat2 %>% do(blankdf(.)) %>% str() # Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 0 obs. of 1 variable: # $ b: Factor w/ 2 levels "1","2": # - attr(*, "vars")=List of 1 # ..$ : symbol b # - attr(*, "drop")= logi TRUE # - attr(*, "indices")= list() # - attr(*, "group_sizes")= int # - attr(*, "biggest_group_size")= int 0 # - attr(*, "labels")='data.frame': 0 obs. of 1 variable: # ..$ b: Factor w/ 2 levels "1","2": # ..- attr(*, "vars")=List of 1 # .. ..$ : symbol b