Reputation: 11
I have a table i want to update:
q)show table:([]letter:`a`b`c`a;fruit:`apple`banana`pear`strawberry;family:`mom`dad`brother`sister)
letter fruit family
-------------------------
a apple mom
b banana dad
c pear brother
a strawberry sister
I want to replace all entries with the name of their respective column.
This seems to work:
q){![table;();0b;(enlist x)!(enlist `x)]}`letter
letter fruit family
-------------------------
letter apple mom
letter banana dad
letter pear brother
letter strawberry sister
...but not this:
q){![table;();0b;(enlist x)!(enlist `x)]}`letter`fruit
'type
[1] {![table;();0b;(enlist x)!(enlist `x)]}
^
q))
The purpose is to create a function that creates dummy variables for categorical variables, so I need a general function. Any suggestions?
Upvotes: 0
Views: 640
Reputation: 13657
Your original functional update could work like this:
q){![table;();0b;x!enlist'[x:(),x]]}cols table
letter fruit family
-------------------
letter fruit family
letter fruit family
letter fruit family
letter fruit family
Upvotes: 2
Reputation: 2800
This can be achieved with @ apply
instead of a functional update like so:
q){@[`table;x;:;x]}`letter`fruit
`table
q)table
letter fruit family
--------------------
letter fruit mom
letter fruit dad
letter fruit brother
letter fruit sister
Edit - For all cols:
{@[`table;x;:;x]} each cols table
or
{@[x;y;:;y]}/[table;cols table]
q)table
letter fruit family
-------------------
letter fruit family
letter fruit family
letter fruit family
letter fruit family
Upvotes: 3