Accessing elements ([], [[]], $) in R Programming - Time & Space Complexity
We want to see how fast we can get parts of data from lists or data frames in R.
How does the time to access elements change when the data grows bigger?
Analyze the time complexity of the following code snippet.
my_list <- list(a = 1:1000, b = letters, c = rnorm(1000))
# Access with [] returns a sublist
sublist <- my_list["a"]
# Access with [[]] returns the element itself
element <- my_list[["a"]]
# Access with $ returns the element by name
element2 <- my_list$a
This code shows three ways to get parts of a list: by name with [], [[]], and $.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Searching the list for the named element.
- How many times: Once per access, no loops inside these operations.
Finding an element by name takes a little longer if the list is bigger, but only a bit.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks |
| 100 | About 100 checks |
| 1000 | About 1000 checks |
Pattern observation: The time grows roughly in direct proportion to the number of elements.
Time Complexity: O(n)
This means the time to find an element grows linearly with the size of the list.
[X] Wrong: "Accessing elements with $ or [[]] is instant no matter how big the list is."
[OK] Correct: The computer must check names one by one until it finds the right one, so bigger lists take more time.
Knowing how element access time grows helps you write faster R code and shows you understand how data structures work behind the scenes.
"What if the list was replaced by a named vector? How would the time complexity of accessing elements change?"
Practice
Solution
Step 1: Understand list element extraction
The[[]]operator extracts a single element from a list and returns it without the list structure.Step 2: Compare with other operators
The[]operator returns a subset as a list,$is a shortcut for named elements but also returns the element itself, and:is a sequence operator unrelated to extraction.Final Answer:
[[]]-> Option AQuick Check:
Single element extraction =[[]][OK]
- Using [] returns a list subset, not a single element
- Confusing $ with [[]] for unnamed elements
- Using : operator for extraction
age from a data frame df using the $ operator?Solution
Step 1: Understand $ operator usage
The $ operator accesses named elements directly by their name without quotes.Step 2: Check syntax correctness
df$ageis correct.df[age]is incorrect because age is not quoted or defined as a variable.df[[age]]expects a variable or string inside double brackets.df$"age"is invalid syntax.Final Answer:
df$age -> Option CQuick Check:
Access named column with $ and name directly [OK]
- Putting quotes inside $ operator like df$"age"
- Using single brackets without quotes
- Confusing [[]] with $ syntax
lst <- list(a = 1:3, b = 4:6), what is the output of lst["a"]?Solution
Step 1: Understand single bracket extraction on lists
Using single brackets[]with a name returns a sublist containing that element, preserving the list structure.Step 2: Apply to given list
lst["a"]returns a list with element named 'a' containing 1:3, not just the vector 1 2 3.Final Answer:
list(a = 1:3) -> Option DQuick Check:
Single bracket returns sublist = list(a = 1:3) [OK]
- Expecting [] to return just the vector inside
- Confusing [] and [[]] behavior
- Assuming output is NULL or wrong element
df <- data.frame(x = 1:3, y = 4:6) value <- df[["z"]]What is the error and how to fix it?
Solution
Step 1: Identify the error cause
The data framedfhas columns 'x' and 'y' but no 'z'. Accessingdf[["z"]]causes a subscript out of bounds error.Step 2: Fix the error
Use a valid column name like 'x' or 'y' inside double brackets to avoid the error.Final Answer:
Error: subscript out of bounds; fix by using an existing column name -> Option BQuick Check:
Accessing non-existent column causes subscript error [OK]
- Assuming [[]] returns NULL if column missing
- Confusing syntax error with runtime error
- Not verifying column existence before access
lst <- list(name = "Alice", scores = c(90, 85, 88)). Which code correctly extracts the second score?Solution
Step 1: Understand list element access
lst$scoresaccesses the vector of scores directly.Step 2: Extract the second element from the vector
Using[2]on the vector gets the second score. Solst$scores[2]works correctly.Step 3: Check other options
lst["scores"][2]uses single brackets which returns a list, and indexing a length-1 list with [2] causes subscript out of bounds.lst$scores["2"]uses character index on unnamed vector, returns NA.lst[[scores]][2]is invalid because scores is not quoted.Final Answer:
lst$scores[2] -> Option AQuick Check:
Use $ to get vector, then [2] for element [OK]
- Using single brackets [] on list then [2] on sublist (out of bounds)
- Using character index ["2"] on unnamed vector (returns NA)
- Not quoting names inside [[]]
Ready to prove it?
Pass the test and this pattern moves unknown
