Raul, thanks for sharing. I also used key in my approach:
http://jsoftware.com/pipermail/programming/2014-June/037869.html

Yours is much simpler and was enjoyable to study.


On Tue, Jul 1, 2014 at 12:40 AM, Raul Miller <[email protected]> wrote:

> On Mon, Jun 30, 2014 at 10:54 PM, Dan Bron <[email protected]> wrote:
> > My wording was ambiguous - sorry about that. The fundamental approach
> would
> > be the same whether the data are numeric or boxed or anything else.  That
> > is, the natural and straightforward way to create a value table from a
> > list of index-value pairs is to first construct a table of placeholders,
> > and then populate it with valid values using } .
>
> Another natural way of generating a value table uses key.
>
> You wind up having to use key, also, if you somehow have multiple relevant
> values for the same index.
>
> What you do is prefix your index-value pairs with the full set of indices
> in canonical order each paired with the default. And your key function
> deals with each instance of the resulting sequences.
>
> For this problem, you would wind up doing that twice - first to form what
> will be the rows, and then again to form the columns.
>
> Then again, for this example, we don't actually have any actual cases where
> we have multiple values that go in the same row, nor in the same column, so
> this approach might be overkill. Nevertheless, here's an example of what
> this kind of implementation might look like:
>
> ids=: /:~ ~.1 {"1 data
> dts=: ":&.> i.1+>./_ ".&>{."1 data
>
> gather=:2 :0
> :
>   ({."1 u@}./. v"1)(x,.a:),y
> )
>
>    dts (ids {. gather {: ])gather}. data
> ┌──┬──┬──┬──┐
> │4 │3 │  │  │
> ├──┼──┼──┼──┤
> │  │5 │9 │  │
> ├──┼──┼──┼──┤
> │6 │  │  │  │
> ├──┼──┼──┼──┤
> │10│  │  │  │
> ├──┼──┼──┼──┤
> │  │  │  │  │
> ├──┼──┼──┼──┤
> │  │  │10│  │
> ├──┼──┼──┼──┤
> │  │  │  │  │
> ├──┼──┼──┼──┤
> │  │10│  │10│
> ├──┼──┼──┼──┤
> │  │  │  │  │
> ├──┼──┼──┼──┤
> │  │  │20│  │
> ├──┼──┼──┼──┤
> │  │11│  │  │
> ├──┼──┼──┼──┤
> │  │  │  │  │
> ├──┼──┼──┼──┤
> │  │  │  │  │
> ├──┼──┼──┼──┤
> │15│  │  │  │
> ├──┼──┼──┼──┤
> │  │12│  │  │
> └──┴──┴──┴──┘
>
> Breaking that down:
>    dts (ids {. gather {: ])gather}. data
>
> I'm using }. when gathering the rows because the "dates" are the first
> column of 'data'. So here's a perspective on what the inner gather deals
> with.
>
>    dts <gather}. data
>
> (Run this yourself - it would line wrap in email, rendering it illegible.)
>
> The inner gather then uses {: to grab the final element from each row of
> data, this becomes the data in the result.
>
> Also, I'm using {. for the inner gather to discard any extra values. If I
> had multiple values to combine, this would be the combining function.  If I
> wanted to be robust I'd probably instead use something like <@(;:inv) for
> this kind of data.
>
> FYI,
>
> --
> Raul
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to