Advanced Data Manipulation with m61r in Pure Base R

pv71u98h1

2026-01-12

Introduction

The m61r package provides a grammar for data manipulation prioritising speed and memory efficiency.

The Pipeline Interface

The m61r object allows for seamless chaining of operations.

p <- m61r(mtcars)
p$filter(~mpg > 20)
p$select(~c(mpg, cyl, hp))
p$mutate(hp_norm = ~hp / max(hp))
p$head()
##    mpg cyl  hp   hp_norm
## 1 21.0   6 110 0.9734513
## 2 21.0   6 110 0.9734513
## 3 22.8   4  93 0.8230088
## 4 21.4   6 110 0.9734513
## 5 24.4   4  62 0.5486726
## 6 22.8   4  95 0.8407080

Advanced Scoped Operations

With Subset Data (.SD)

You can use the .SD() method within a formula to access the current data subset for advanced transformations.

p <- m61r(iris)
p$mutate(scaled = ~lapply(.SD()[, vapply(.SD(), is.numeric, logical(1))], 
                          function(x) x * 100))
p$head(3)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          510         350          140          20  setosa
## 2          490         300          140          20  setosa
## 3          470         320          130          20  setosa

With select_cols

The .select_cols helper allows for clean, functional column selection based on predicates.

tmp <- m61r(mtcars)
tmp$mutate(all_num = ~lapply(.SD()[, .select_cols(.SD(), is.numeric)], 
                             function(x) x * 10))
tmp$head(3)
##   mpg cyl disp   hp drat    wt  qsec vs am gear carb
## 1 210  60 1600 1100 39.0 26.20 164.6  0 10   40   40
## 2 210  60 1600 1100 39.0 28.75 170.2  0 10   40   40
## 3 228  40 1080  930 38.5 23.20 186.1 10 10   40   10

Conversions

Easily convert multiple columns at once using standard R functions inside the m61r environment.

p <- m61r(mtcars)
# Convert all columns to numeric using lapply for Base R purity
p$mutate(~lapply(.SD(), as.numeric))

Pattern Matching with Grep

Use grep to apply transformations to columns matching specific naming patterns.

p <- m61r(mtcars)
# Normalize only columns that contain the word "mpg" or "hp"
p$mutate(~lapply(.SD()[, grep("mpg|hp", names(.SD()))], function(x) x / max(x)))
p$head()
##         mpg cyl disp        hp drat    wt  qsec vs am gear carb
## 1 0.6194690   6  160 0.3283582 3.90 2.620 16.46  0  1    4    4
## 2 0.6194690   6  160 0.3283582 3.90 2.875 17.02  0  1    4    4
## 3 0.6725664   4  108 0.2776119 3.85 2.320 18.61  1  1    4    1
## 4 0.6312684   6  258 0.3283582 3.08 3.215 19.44  1  0    3    1
## 5 0.5516224   8  360 0.5223881 3.15 3.440 17.02  0  0    3    2
## 6 0.5339233   6  225 0.3134328 2.76 3.460 20.22  1  0    3    1

Complex Conditional Logic

The case_when function provides a vectorised way to handle complex conditional assignments.

p <- m61r(mtcars)
p$mutate(category = ~case_when(
  mpg > 25, "Eco",
  mpg > 18, "Standard",
  "High-Perf"
))
head(p[, c("mpg", "category")], 5)
##    mpg category
## 1 21.0 Standard
## 2 21.0 Standard
## 3 22.8 Standard
## 4 21.4 Standard
## 5 18.7 Standard

Across

The across() function provides a familiar syntax for applying functions across a selection of columns during summarisation.

p <- m61r(mtcars)
p$summarise(
  avg = ~across(c("mpg", "disp", "hp"), mean)
)

Conclusion

By staying true to Base R, m61r ensures that your code remains portable, fast, and light.