# Selecting multiple columns from a matrix?

Sample data:

data = {
{{2013, 1, 1}, 24.13, 167.67, 231.82},
{{2013, 1, 2}, 32.15, 170.92, 225.99},
{{2013, 1, 3}, 35.43, 172.68, 221.67},
{{2013, 1, 4}, 36.73, 173.05, 218.32},
{{2013, 1, 5}, 58.19, 165.96, 197.05},
{{2013, 1, 6}, 69.99, 163.50, 187.52},
{{2013, 1, 7}, 71.37, 154.21, 175.58},
{{2013, 1, 8}, 72.51, 149.66, 163.25}};


I want a DateListPlot with three graphs, so for a matrix formed by columns 1 and 2, one for columns 1 and 3, and 1 for columns 1 and 4. At the moment I'm using this code:

data2 = Transpose[{data[[All, 1]], data[[All, 2]]}];
data3 = Transpose[{data[[All, 1]], data[[All, 3]]}];
data4 = Transpose[{data[[All, 1]], data[[All, 4]]}];
DateListPlot[{data2, data3, data4}, Joined -> True, Filling -> {3 -> {1}}]


but I have a hunch that this can be done more efficiently. I don't like the Transposes in particular. Any ideas?

edit (for extra credit)
What if I need to multiply the second column by 2, which in my solution is simply

data2 = Transpose[{data[[All, 1]], 2 * data[[All, 2]]}];

-

This method allows you to define arbitrary column indexes, not necessarily that orderly as you have. Just put them in the list:

iNeed = {{1, 2}, {1, 3}, {1, 4}};


then this will do the job and make a plot identical to yours:

DateListPlot[data[[All, #]] & /@ iNeed, Joined -> True, Filling -> {3 -> {1}}]


basically it does this but in a shorter way:

DateListPlot[{
data[[All, {1, 2}]],
data[[All, {1, 3}]],
data[[All, {1, 4}]]
}, Joined -> True, Filling -> {3 -> {1}}]

-
Or DateListPlot[data[[;;, {1, #}]] & /@ {2,3,4}, Joined -> True, Filling -> {3 -> {1}}] – belisarius has settled Jan 25 '13 at 19:41
@belisarius Yes, but only in his specific case ;) – Vitaliy Kaurov Jan 25 '13 at 19:42
@VitaliyKaurov Not now – belisarius has settled Jan 25 '13 at 19:42
@stevenvh Thanks. I did almost the same than Vitaliy and he posted earlier. I don't think the small difference deserves another answer – belisarius has settled Jan 25 '13 at 19:44
@stevenvh I put it back ;) – Vitaliy Kaurov Jan 25 '13 at 19:45

Another variation, not as readable as Vitaliy's:

DateListPlot[Transpose[Tuples[{{#1}, {##2}}] & @@@ data],
Joined -> True, Filling -> {3 -> {1}}]


To multiple the second column by 2 just insert a multiplier list in front of {##2}:

DateListPlot[Transpose[Tuples[{{#1}, {2, 1, 1} {##2}}] & @@@ data],
Joined -> True, Filling -> {3 -> {1}}]

-
Simon, I love your style. Unfortunately it's mine too! I wrote the exact same code as your first line. :^) (Well, I use # rather than #1 but that's splitting hairs.) – Mr.Wizard Jan 26 '13 at 7:04
@Mr.Wizard, I find this happens quite a lot the other way round :-) – Simon Woods Jan 26 '13 at 17:56
I now know who to contact if I want to work on project with someone. – Mr.Wizard Jan 26 '13 at 18:01