- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Slicing Associative Arrays?
Fox matrix indexing, one can use 0 and get a full slice:
m = [ 1 2 , 3 4];
m[0,1]; // [1, 3]
For Data tables this works as well:
test = new table("test", add rows(10), new column("col1",Character, set each value({"A","B","C"}[random integer(3)])),new column("col2", set each value(random uniform(5))));
test[4,0]
For lists of lists, this is not possible:
list= {{"A", 3},{"B", 5}};
list[0,1]
Sure, there are many lists of lists where such slicing is not possible, like {{"A", 3},{"B"}}.
On the other hand, there ARE many lists of list that would allow it.
Where it gets really interesting: Associative arrays of associative arrays.
Like with lists, the concept of Associative Arrays is more flexible than what we can do with a matrix or data table - so slicing will not work for them. But like with lists, there ARE Associative arrays where slicing will work ...
Is there a function in JSL, something like myAssociativeArray[0, "weight"], which does this job?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
dt << Save( "$DOWNLOADS/test.json" );
// for sake of simplicity we accept to lose 1x ROBERT
myIndex=dt[0,"name"]
myAssociativeArray = Associative Array(myIndex,ParseJSON(Load text file ( "$DOWNLOADS/test.json")));
// cool, but not what we want
mapToWeight = Transform Each({{key, value}}, aa, value["weight"]);
SliceAssociativeArray= Function({aa, indexname},
Transform Each({value}, aa << get values, value[indexname])
);
SliceAssociativeArray(myAssociativeArray ,"weight") //myAssociativeArray [0, "weight"]
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Slicing Associative Arrays?
Different data structures have different uses, for associative array (I think) it means storing unique keys and getting the values for those keys fast (it stores key-value pairs). Transform Each is one good option to use, just change the output
weights = Transform Each({{key, value}}, aa, Output("List"),
value["weight"]
);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Slicing Associative Arrays?
Another cool trick - very useful
From the useability, I think
weights = Transform Each({{key, value}}, aa, Output("List"),
value["weight"]
);
and
Transform Each({value}, aa << get values, value["weight"])
from the original post are on a comparable value
... quite far from aa[0, "weight"]
Just imagine that you want to get all the aa[0,"2024",0,0,"date"].
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Slicing Associative Arrays?
I'm not sure what this should "query" aa[0,"2024",0,0,"date"].If you only wish to get "0" indices, you could store your values to associative array in such a way, that your keys are column names and values are lists of the row values.
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
aa = Associative Array();
For Each({colname}, dt << Get Column Names("String"),
aa[colname] = As List(Column(dt, colname) << get values);
);
Generally if I want to store my data in table like format which can be accessed like a table, I would just use (private) JMP data table.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Slicing Associative Arrays?
good point : )