76

So, if one wishes to apply an operation row by row in dplyr, one can use the rowwise function, for example: Applying a function to every row of a table using dplyr?

Is there a unrowwise function which you can use to stop doing operations row by row? Currently, it seems adding a group_by after the rowwise removes row operations, e.g.

data.frame(a=1:4) %>% rowwise() %>% group_by(a)
# ...
# Warning message:
# Grouping rowwise data frame strips rowwise nature 

Does this mean one should use group_by(1) if you wish to explicitly remove rowwise?

Community
  • 1
  • 1
Alex
  • 15,186
  • 15
  • 73
  • 127
  • 10
    Does `ungroup()` work? – r2evans Apr 21 '15 at 03:44
  • I rolled-back the title edit as it is not clear to me that `rowwise` creates a `grouped_df`. Also, see this related issue. https://github.com/hadley/dplyr/pull/553 – Alex Oct 22 '15 at 22:00

3 Answers3

93

As found in the comments and the other answer, the correct way of doing this is to use ungroup().

The operation rowwise(df) sets one of the classes of df to be rowwise_df. We can see the methods on this class by examining the code here, which gives the following ungroup method:

#' @export
ungroup.rowwise_df <- function(x) {
  class(x) <- c( "tbl_df", "data.frame")
  x
}

So we see that ungroup is not strictly removing a grouped structure, instead it just removes the rowwise_df class added from the rowwise function.

Alex
  • 15,186
  • 15
  • 73
  • 127
15

Just use ungroup()

The following produces a warning:

data.frame(a=1:4) %>% rowwise() %>% 
  group_by(a)
#Warning message:
#Grouping rowwise data frame strips rowwise nature

This does not produce the warning:

data.frame(a=1:4) %>% rowwise() %>% 
  ungroup() %>% 
  group_by(a)
Martin Gal
  • 16,640
  • 5
  • 21
  • 39
Rtist
  • 3,825
  • 2
  • 31
  • 40
6

You can use as.data.frame(), like below

> data.frame(a=1:4) %>% rowwise() %>% group_by(a)
# A tibble: 4 x 1
# Groups:   a [4]
      a
* <int>
1     1
2     2
3     3
4     4
Warning message:
Grouping rowwise data frame strips rowwise nature 

> data.frame(a=1:4) %>% rowwise() %>% as.data.frame() %>% group_by(a)
# A tibble: 4 x 1
# Groups:   a [4]
      a
* <int>
1     1
2     2
3     3
4     4
Martin Gal
  • 16,640
  • 5
  • 21
  • 39
ishonest
  • 433
  • 4
  • 8