subset

Basics

subset is a function that helps you take subsets of data. By default, subset removes NA rows.

subset does not perform any operation that can’t be accomplished by indexing.

With indexing, we would write something like:

grades[grades$year=="junior" | grades$sex=="M",]$grade
[1] 100  75  74  69  88  99  90  92

Using subset, we can instead do this:

subset(grades, year=="junior" | sex=="M", select=grade)
   grade
1    100
3     75
4     74
6     69
7     88
8     99
9     90
10    92

Unlike indexing, NA values will be removed by subset automatically:

grades$sex[8] <- NA
subset(grades, year=="junior" | sex=="M", select=grade)
   grade
1    100
3     75
4     74
6     69
7     88
9     90
10    92
grades[grades$year=="junior" | grades$sex=="M",]$grade
[1] 100  75  74  69  88  NA  90  92


Examples

How can I make a subset of the 8451 data using 1 line of code?

Click to see solution

In the 84.51 data set, we look at the variables and dimensions:

myDF <- read.csv("/depot/datamine/data/8451/The_Complete_Journey_2_Master/5000_transactions.csv")
head(myDF)
dim(myDF)
BASKET_NUM	HSHD_NUM	PURCHASE_	PRODUCT_NUM	SPEND	UNITS	STORE_R	WEEK_NUM	YEAR
      <dbl>    <dbl>	     <chr>	      <dbl>	<dbl>	<int>	   <chr>	   <int>	<int>
         24	    1809	03-JAN-16	    5817389	-1.50	-1	      SOUTH	      1	2016
         24	    1809	03-JAN-16	    5829886	-1.50	-1	      SOUTH	      1	2016
         34	    1253	03-JAN-16	     539501	 2.19	 1	      EAST	      1	2016
         60	    1595	03-JAN-16	    5260099	 0.99	 1	      WEST	      1	2016
         60	    1595	03-JAN-16	    4535660	 2.50	 2	      WEST	      1	2016
         168	 3393	03-JAN-16	    5602916	 4.50	 1	      SOUTH	      1	2016

10625553
9

There are 10625553 rows and 9 columns.

We can use the subset function to focus on only the purchases from the CENTRAL store region, in the YEAR 2016. We can also pick which variables (columns) that we want to include in the new data frame.

The subset function knows which data set that we are working with, because we specify it as the first parameter in the subset function, so we don’t need to include myDF before each variable. The structure of the subset function is as follows: subset(x, subset, select, drop=FALSE, …​). The subset parameter describes the rows that we are interested in. (In particular, we specify the conditions that we want the rows to satisfy.) The select parameter describes the columns that we are interested in. (We list the columns by their names, and we need to put each such column name in double quotes.)
myfocusedDF <- subset(myDF, subset=(STORE_R=="CENTRAL") & (YEAR==2016),
select=c("PURCHASE_","PRODUCT_NUM","SPEND","UNITS") )
myfocusedDF

This new data set has only 1246144 rows, i.e., about 12 percent of the purchases, as expected. It also has only the 4 columns that we specified in the subset function.

dim(myfocusedDF)
1246144
4

How can I make a subset of the election data using 1 line of code?

Click to see solution

Here is an example of how to use the subset function with the data from the federal election campaign contributions from 2016:

library(data.table)
myDF <- fread("/depot/datamine/data/election/itcont2016.txt", sep="|")
dim(myDF)
20557796
21
mymidwestDF <- subset(myDF, subset=(STATE %in% c("IN","IL","OH","MI","WI")) & (TRANSACTION_AMT > 0),
select=c("NAME","CITY","STATE","TRANSACTION_AMT") )

We can use the subset command to focus on the donations made from Midwest states, and limit our results to those donations that had positive TRANSACTION_AMT values. We can extract interesting variables, e.g., the NAME, CITY, STATE, and TRANSACTION_AMT.

dim(mymidwestDF)
2435825
4

The resulting data frame has 2435825 rows.

tail( sort( tapply(mymidwestDF$TRANSACTION_AMT, mymidwestDF$NAME, sum) ) )
UIHLEIN, RICHARD E.                          JOBSOHIO ASSOCIATION OF REALTORS, NATIONAL
            9216700                          10000000                          10234334
PRITZKER, JAY ROBERT                  UIHLEIN, RICHARD                    EYCHANER, FRED
            10511348                          11866100                          37901658

From the data set, we can sum the TRANSACTION_AMT values, grouped according to the NAME of the donor, and we find that "Fred Eychaner" was the top Midwesterner donor during the 2016 federal election campaigns.