wch · GitHub

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

Read the original on github.com ↗