Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using table() in dplyr chain

Can someone explain why table()doesn't work inside a chain of dplyr-magrittr piped operations? Here's a simple reprex:

tibble(
  type = c("Fast", "Slow", "Fast", "Fast", "Slow"),
  colour = c("Blue", "Blue", "Red", "Red", "Red")
) %>% table(.$type, .$colour)

Error in sort.list(y) : 'x' must be atomic for 'sort.list' Have you called 'sort' on a list?

But this works of course:

df <- tibble(
  type = c("Fast", "Slow", "Fast", "Fast", "Slow"),
  colour = c("Blue", "Blue", "Red", "Red", "Red")
) 

table(df$type, df$colour)


       Blue Red
  Fast    1   2
  Slow    1   1
like image 470
RobertMyles Avatar asked Jun 13 '17 17:06

RobertMyles


2 Answers

This behavior is by design: https://github.com/tidyverse/magrittr/blob/00a1fe3305a4914d7c9714fba78fd5f03f70f51e/README.md#re-using-the-placeholder-for-attributes

Since you don't have a . on it's own, the tibble is still being passed as the first parameter so it's really more like

... %>% table(., .$type, .$colour)

The official magrittr work-around is to use curly braces

... %>% {table(.$type, .$colour)}
like image 123
MrFlick Avatar answered Sep 30 '22 09:09

MrFlick


The %>% operator in dplyr is actually imported from magrittr. With magrittr, we can also use the %$% operator, which exposes the names from the previous expression:

library(tidyverse)
library(magrittr)

tibble(
  type = c("Fast", "Slow", "Fast", "Fast", "Slow"),
  colour = c("Blue", "Blue", "Red", "Red", "Red")
) %$% table(type, colour)

Output:

      colour
type   Blue Red
  Fast    1   2
  Slow    1   1
like image 32
acylam Avatar answered Sep 30 '22 09:09

acylam