4. Modes (types) - JulTob/R GitHub Wiki

Ahoy! Ye’ve hauled in a treasure trove: modes, classes, structures... the very backbone of R’s strange and powerful type system. And ye askin' the right question: what the devil is a “mode”?

🧠 Clarifyin’ the Mystery of “Mode” vs “Class”

In R, we have:

  • mode(): tells ye the storage mode, the low-level type R uses internally.
  • class(): tells ye the higher-level behavior, like whether an object acts like a factor, data frame, model, etc.

So in most cases:

  • A vector of numbers will have mode = "numeric" and class = "numeric".
  • A factor has mode = "numeric" but class = "factor" — sneaky!
  • A data.frame has mode = "list" but class = "data.frame"

Most sailors just use class() in modern R, as it reflects what R thinks the object is.

🧭 Compass of Data Modes and Structures

“Know not just what yer objects are, but how they behave and what cargo they carry!”

⸻

🔸 Basic Modes (Primitive Data Types)

These be the fundamental types in R, used to build all else.

1. Logical

T
F

Short for TRUE and FALSE, these are used in comparisons, conditions, and logical operations.

2. Numeric

> a + b
> a - b
> a * b
> a / b
> a^b
> sqrt(a)
> exp(1)
```R

Arithmetic with numeric values works as expected. 

Comparisons return logical results:

```R
> a == b
> a != b
> a < b
> a >= b

3. Complex

> z <- 2 + 3i
> class(z)
[1] "complex"

Used rarely, but available if ye sail in mathematical waters.

4. Character

'a'
"yo-ho-ho"

Strings be marked with single or double quotes.

⸻

🧰 Composite Structures (Object Containers)

Here be the containers that hold yer values, either singly or in bulk.

⸻

🪙 Vector

A vector be a ledger of values, all of the same type.

> vect <- c(1, 2, 3, 5, 7)
> mode(vect)
[1] "numeric"
> length(vect)
[1] 5

Vectors can be numeric, character, logical, or even complex:

> starks <- c("Rob", "John", "Ned", "Sansa")
> mode(starks)
[1] "character"

Access elements by position:

> x <- c(-5:5)
> x[1:3]
[1] -5 -4 -3

Modify elements:

> x[2] <- 0

Vectors can be named, makin’ them like small dictionaries:

> z <- c(5, 3, 4)
> names(z) <- c("hypot", "cat1", "cat2")
> z
hypot  cat1  cat2 
    5     3     4 

Vector arithmetic is element-wise:

> x1 <- c(0:3)
> x2 <- c(1:4)
> x1 + x2
[1] 1 3 5 7

⸻

🧱 Matrix

A matrix be a 2D rectangular block of one type only:

> A <- matrix(c(1, 2, 3, 4), ncol = 2)

You can bind columns or rows:

> B <- cbind(c(1:3), c(4:6))
> t(B)     # Transpose

Give it row/column names for clarity:

> C <- matrix(c(1:8), nrow=2,
              dimnames=list(c("Fila1","Fila2"),
                            c("Col1","Col2","Col3","Col4")))

⸻

🎭 Factor

Used to represent categories like "Yes"/"No", "Red"/"Blue":

> coin <- factor(c("heads", "tails", "heads"))
> class(coin)
[1] "factor"

These look like strings but behave as indexed levels.

⸻

📊 Data Frame

A data frame be like a spreadsheet: columns of mixed types.

> df <- data.frame(name = c("Arya", "Bran"), age = c(16, 14))

Each column is a vector, but they can differ in type. R prints these as tables.

⸻

🔀 List

The most flexible object: holds anything.

> my_list <- list(name = "Brienne", age = 32, swords = c("Oathkeeper", "Widow’s Wail"))

Lists can contain vectors, data frames, even other lists. It be the cargo hold of the ship.

⸻

⚖️ Summary Table of Modes vs Structures

Structure Homogeneous? Mixed Types? 2D? Typical Class
Vector ✅ ❌ ❌ “numeric”, etc.
Matrix ✅ ❌ ✅ “matrix”
List ❌ ✅ ❌ “list”
Data Frame Columns can vary ✅ ✅ “data.frame”
Factor ✅ (underlying numeric) ❌ ❌ “factor”

With this chart in yer hands, ye can now peer into the soul of any object in R, and choose the right vessel to carry yer data forward.