Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Data manipulation in R in LINQ style

Tags:

r

linq

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();
like image 328
Vadim Kantorov Avatar asked Sep 03 '11 03:09

Vadim Kantorov


1 Answers

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
)
like image 195
Owen Avatar answered Oct 24 '22 22:10

Owen