Site icon R-bloggers

with( )

[This article was first published on woodpeckR, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Problem

Making graphics with base R is annoying for many reasons, but a big one is having to type the name of the data frame over and over again to reference different columns.

Context

Back to our Mississippi River fish data. I’ve aggregated my sampling points into polygons, and now I want to explore some of their characteristics. To do that, I’d like to make some tables and plots, and because these are just quick, exploratory plots, I don’t feel like dealing with ggplot.

Load in the data (accessible on GitHub).

# Load data from GitHub
polygon <- read.csv("https://raw.githubusercontent.com/kaijagahm/general/master/polygon_sampling_data_UMR.csv")

# Look at what we're dealing with
dim(polygon) # How big is the data set?
[1] 527  21
head(polygon, 3) # Look at the first few rows
     poly_id propsnag n_points habitat_code
1 P04_CFL_13      0.8        5          CFL
2 P04_CFL_14      0.2        5          CFL
  pool      Area Perimeter max_depth
1    4 105288.80  2067.890      1.30
2    4  42668.28  1770.465      0.74
  avg_depth tot_vol shoreline_density_index
1 0.3625869   33955                1.797759
2 0.3291391    5953                2.417852
  pct_aqveg pct_terr pct_prm_wetf
1  19.13396 93.87983     79.67522
2  41.25270 94.76871     42.44244
  med_dist_to_land med_dist_to_forest
1         34.13379           34.13379
2         18.90166           32.64112
  med_current wingdam revetment tributary
1        0.02       0         1         0
2        0.02       0         0         0
  pct_shallow_area
1        0.9278354
2        1.0000000

First, I’d like to see how total volume tot_vol of the aquatic area scales with its Area.

In base R:

# Formula notation
plot(polygon$tot_vol ~ polygon$Area) 
# OR:
# Comma notation
plot(polygon$Area, polygon$tot_vol)

Either way, we get this:

Or a more informative plot, with both variables on a log scale:

plot(log(polygon$tot_vol) ~ log(polygon$Area))

This isn’t too too clunky, but if the data frame name or column names are long, it can get a little annoying.

Solution

The with() function allows you to specify the data frame your variables are coming from and then reference the variables with respect to the data frame, similar to the ggplot argument data =. Handy.

# Plot using the with() function
with(polygon, plot(tot_vol ~ Area))

You can add any other arguments inside of the function, as normal, it’s just now wrapped in with().

# Log-transform variables and make the points blue dots, because why not?
with(polygon, plot(log(tot_vol) ~ log(Area), # log-transform
          pch = 20, # dots instead of circles
          col = "blue", # make the dots blue
          main = "Polygon volume by area, log-transformed") # title
    )

It’s worth noting that this works for other functions besides plot(), too. Here’s an example with table(): let’s look at how many sampling polygons include revetment, broken down by navigation pool (area of the river). The data set contains three navigation pools: 4, 8, and 13.

# Two-way table by pool and revetment
with(polygon, table(revetment, pool))


 

Outcome

Quick plots and data manipulation made even quicker!

Resources

Discussion of when to use with():
https://stackoverflow.com/questions/42283479/when-to-use-with-function-and-why-is-it-good

To leave a comment for the author, please follow the link and comment on their blog: woodpeckR.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.