Subsetting & Indexing

Subsetting is the act of pulling specific elements out of an R object using square brackets, with [ ] keeping a subset, [[ ]] extracting one element, and $ reaching a named element of a list.

Learn Subsetting & Indexing in our free R course — a beginner-friendly interactive lesson with worked examples, a practice exercise and a quick reference.

Part of the free R course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.

By the end you'll confidently index by position, by negative position, by logical condition, and by name, and you'll know exactly when to use [ ] versus [[ ]] versus $ on vectors and lists.

What You'll Learn in This Lesson

1️⃣ Indexing a Vector: Four Ways

Single brackets accept four kinds of index. A positive number selects by position, a vector of numbers selects several, a negative number drops positions, and a name (if your vector is named) selects by label. R indexes from 1 .

2️⃣ Logical Indexing & which()

The most powerful form: pass a logical vector and keep the elements where it is TRUE . The comparison itself ( nums 10 ) produces that logical vector. Use which() when you want the positions instead of the values, and combine tests with & (and) / | (or).

3️⃣ Lists: [ ] vs [[ ]] vs $

Lists hold elements of different types, so the bracket you choose matters. [ ] keeps the list wrapper and returns a shorter list. [[ ]] reaches inside and returns the bare element. $ is a friendly shorthand for [[ ]] by name. Once you have the element with [[ ]] or $ , you can index into it normally.

Memorise the one-liner: [ ] keeps the box, [[ ]] and $ open the box.

Your turn. Fill in the ___ blanks, run it, and compare with the expected output.

This challenge forces you to switch between $ , [[ ]] , and [ ] on the same object — exactly the muscle memory you need for real data work.

📋 Quick Reference — Subsetting

Practice quiz

In R, what does x[1] return for a vector x?

  • The first element (R indexes from 1)
  • An empty result
  • The second element
  • The whole vector

Answer: The first element (R indexes from 1). R is 1-indexed, so x[1] is the first element.

What does x[-1] do?

  • Returns the last element
  • Returns everything except the first element
  • Errors
  • Returns NA

Answer: Returns everything except the first element. A negative index drops that position, so x[-1] is all but the first.

What does x[0] return in R?

  • The first element
  • An error
  • An empty vector of the same type
  • NULL

Answer: An empty vector of the same type. Index 0 selects nothing, returning a length-0 vector of x's type.

Which operator extracts a single VALUE from a list, dropping the wrapper?

[[ ]] reaches inside and returns the bare element; [ ] keeps the list wrapper.

What does lst$name do on a list?

  • Returns a list of length 1

$ is a friendly shorthand for [[ ]] by name on lists and data frames.

Given nums, what does nums[nums > 10] return?

  • The positions where nums > 10
  • The count of elements over 10
  • The elements whose value exceeds 10
  • TRUE or FALSE

Answer: The elements whose value exceeds 10. A logical vector inside [ ] keeps the elements where the test is TRUE.

What does which(nums > 10) return?

  • The integer positions that are TRUE
  • The matching values
  • A single TRUE/FALSE
  • The number of matches

Answer: The integer positions that are TRUE. which() converts a logical vector into the positions where it is TRUE.

Why does person[1] give a list but person[[1]] give the value?

[ ] preserves the list wrapper; [[ ]] extracts the element itself.

Which correctly combines two element-wise conditions inside [ ]?

Single & is element-wise; && only compares the first element.

What happens with x[c(1, -2)] mixing positive and negative indices?

  • Returns elements 1 and 2
  • Drops element 2 only
  • Returns the whole vector
  • It is an error

Answer: It is an error. You cannot mix positive and negative indices in one bracket.