Accessing columns, rows, or cells via $
, [[
, or [
is mostly similar to
regular data frames. However, the
behavior is different for tibbles and data frames in some cases:
[
always returns a tibble by default, even if
only one column is accessed.
Partial matching of column names with $
and [[
is not supported, a
warning is given and NULL
is returned.
Unstable return type and implicit partial matching can lead to surprises and
bugs that are hard to catch. If you rely on code that requires the original
data frame behavior, coerce to a data frame via as.data.frame()
.
# S3 method for tbl_df [[(x, i, j, ..., exact = TRUE) # S3 method for tbl_df $(x, name) # S3 method for tbl_df [(x, i, j, drop = FALSE)
x | data frame. |
---|---|
i, j | Row and column indices. If |
... | Ignored. |
exact | Ignored, with a warning. |
name | A literal character string or a name (possibly backtick quoted). |
drop | Coerce to a vector if fetching one column via |
For better compatibility with older code written for regular data frames,
[
supports a drop
argument which defaults to FALSE
.
New code should use [[
to turn a column into a vector.
df <- data.frame(a = 1:3, bc = 4:6) tbl <- tibble(a = 1:3, bc = 4:6) # Subsetting single columns: df[, "a"]#> [1] 1 2 3tbl[, "a"]#> # A tibble: 3 x 1 #> a #> <int> #> 1 1 #> 2 2 #> 3 3tbl[, "a", drop = TRUE]#> [1] 1 2 3#> [1] 1 2 3# Subsetting single rows with the drop argument: df[1, , drop = TRUE]#> $a #> [1] 1 #> #> $bc #> [1] 4 #>tbl[1, , drop = TRUE]#> # A tibble: 1 x 2 #> a bc #> <int> <int> #> 1 1 4#> $a #> [1] 1 #> #> $bc #> [1] 4 #># Accessing non-existent columns: df$b#> [1] 4 5 6tbl$b#> Warning: Unknown or uninitialised column: 'b'.#> NULLdf[["b", exact = FALSE]]#> [1] 4 5 6tbl[["b", exact = FALSE]]#> Warning: exact ignored#> NULL#> NULLtbl$b#> Warning: Unknown or uninitialised column: 'b'.#> NULLdf$b <- 7:9 tbl$b <- 7:9 df$b#> [1] 7 8 9tbl$b#> [1] 7 8 9# Identical behavior: tbl[1, ]#> # A tibble: 1 x 4 #> a bc bd b #> <int> <int> <chr> <int> #> 1 1 4 n 7#> # A tibble: 1 x 2 #> bc a #> <int> <int> #> 1 4 1#> # A tibble: 3 x 2 #> bc a #> <int> <int> #> 1 4 1 #> 2 5 2 #> 3 6 3#> # A tibble: 3 x 2 #> bc a #> <int> <int> #> 1 4 1 #> 2 5 2 #> 3 6 3tbl["a"]#> # A tibble: 3 x 1 #> a #> <int> #> 1 1 #> 2 2 #> 3 3tbl$a#> [1] 1 2 3tbl[["a"]]#> [1] 1 2 3