Skip to content

Instantly share code, notes, and snippets.

@ConorIA
Last active February 26, 2019 04:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ConorIA/519cfa3ab18297191b837f233d7f5982 to your computer and use it in GitHub Desktop.
Save ConorIA/519cfa3ab18297191b837f233d7f5982 to your computer and use it in GitHub Desktop.
Piping into `bind_rows()` ... a query

Problem

I have a dataframe (dat) in my environment. I want to load a new dataframe from CSV, clean it up a little, and then append it to the end of my dat object.

Option 1:

Pipe into bind_rows()

dat <- read_csv("https://raw.githubusercontent.com/ConorIA/tidy-intro/master/data/31688-daily-2001-2018.csv") %>%
  select(Date = `Date/Time`, MaxTemp = `Max Temp (°C)`,
         MinTemp = `Min Temp (°C)`, MeanTemp = `Mean Temp (°C)`) %>%
  filter(Date >= "2003-01-01") %>% 
  bind_rows(dat %>% filter(Date < "2003-01-01"), .)

Does the above violate Hadley's guidance? Ref: r4ds, 18.3, bullet number 2:

You have multiple inputs or outputs. If there isn’t one primary object
being transformed, but two or more objects being combined together,
don’t use the pipe.

Option 2:

Nest piped operations into bind_rows()

dat <- bind_rows(
  dat %>% filter(Date < "2003-01-01"),
  read_csv("https://raw.githubusercontent.com/ConorIA/tidy-intro/master/data/31688-daily-2001-2018.csv") %>%
    select(Date = `Date/Time`, MaxTemp = `Max Temp (°C)`,
           MinTemp = `Min Temp (°C)`, MeanTemp = `Mean Temp (°C)`) %>%
    filter(Date >= "2003-01-01")
)

Option 3:

Use an intermediate object.

dat2 <- read_csv("https://raw.githubusercontent.com/ConorIA/tidy-intro/master/data/31688-daily-2001-2018.csv") %>%
  select(Date = `Date/Time`, MaxTemp = `Max Temp (°C)`,
         MinTemp = `Min Temp (°C)`, MeanTemp = `Mean Temp (°C)`) %>%
  filter(Date >= "2003-01-01")

dat <- dat %>% filter(Date < "2003-01-01") %>% bind_rows(dat2)

OR

dat <- dat %>% filter(Date < "2003-01-01")

dat2 <- read_csv("https://raw.githubusercontent.com/ConorIA/tidy-intro/master/data/31688-daily-2001-2018.csv") %>%
  select(Date = `Date/Time`, MaxTemp = `Max Temp (°C)`,
         MinTemp = `Min Temp (°C)`, MeanTemp = `Mean Temp (°C)`) %>%
  filter(Date >= "2003-01-01")

dat <- bind_rows(dat, dat2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment