Search code examples
linqr

Data manipulation in R in LINQ style


I'm interested if there's a package in R to support call-chain style data manipulation, like in C#/LINQ, F#? I want to enable style like this:

var list = new[] {1,5,10,12,1};
var newList = list
  .Where(x => x > 5)
  .GroupBy(x => x%2)
  .OrderBy(x => x.Key.ToString())
  .Select(x => "Group: " + x.Key)
  .ToArray();

UPD: it appears that the pipe operator |> was added to the core R in version 4.1.0


Solution

  • I don't know of one, but here's the start of what it could look like:

    `%then%` = function(x, body) {
        x = substitute(x)
        fl = as.list(substitute(body))
        car = fl[[1L]]
        cdr = {
            if (length(fl) == 1)
                list()
            else
                fl[-1L]
        }
        combined = as.call(
            c(list(car, x), cdr)
        )
        eval(combined, parent.frame())
    }
    
    df = data.frame(x = 1:7)
    df %then% subset(x > 2) %then% print
    

    This prints

      x
    3 3
    4 4
    5 5
    6 6
    7 7
    

    If you keep using hacks like that it should be pretty simple to get the kind of syntax you find pleasing ;-)

    edit: combined with plyr, this becomes not bad at all:

    (data.frame(
        x = c(1, 1, 1, 2, 2, 2),
        y = runif(6)
    )
        %then% subset(y > 0.2)
        %then% ddply(.(x), summarize,
                ysum   = sum(y),
                ycount = length(y)
            )
        %then% print
    )