subset
Basics
subset  is a function that helps you take subsets of data. By default, subset removes NA rows.
| subsetdoes 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 subsetfunction knows which data set that we are working with, because we specify it as the first parameter in thesubsetfunction, so we don’t need to includemyDFbefore each variable.
The structure of thesubsetfunction is as follows:subset(x, subset, select, drop=FALSE, …).
Thesubsetparameter describes the rows that we are interested in. (In particular, we specify the conditions that we want the rows to satisfy.)
Theselectparameter 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") )
myfocusedDFThis 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.