egor7
egor7

Reputation: 4940

Reshape [cols;table]

How do I get columns from a table? If they don't exist it's ok to get them as null columns.

Trying reshape#:

q)d:`a`b!1 2
q)enlist d
a b
---
1 2
q)`a`c#d
a| 1
c|
q)`a`c#enlist d
'c
  [0]  `a`c#enlist d
           ^

Why does thereshape# operator not work on a table? It could easily act on each row (which is dict) and combine results. So I'm forced to write:

q)`a`c#/:enlist d
a c
---
1

Is it the shortest way?

Upvotes: 1

Views: 224

Answers (1)

Cathal O'Neill
Cathal O'Neill

Reputation: 3179

Any key you try to take (#) which is not present in a dictionary will be assigned a null value of the same type as the first value in the dictionary. Similar behaviour is not available for tables.

q)`a`c#`a`b!(1 2;())
a| 1 2
c| `long$()
q)`b`c#`a`b!(();1 2)
b| 1 2
c| ()

Like you mentioned, the use of each-right (/:) will act on each row of the table IE each dictionary. Instead of using an iterator to split the table into dictionaries we can act on the dictionary itself. This will return the same output and is slightly faster.

q)d:`a`b!1 2
q)enlist`a`c#d
a c
---
1
q)(`a`c#/:enlist d)~enlist`a`c#d
1b
q)\ts:1000000 enlist`a`c#d
395 864
q)\ts:1000000 `a`c#/:enlist d
796 880

Upvotes: 1

Related Questions