Re: Map onto a column
- To: mathgroup at smc.vnet.net
 - Subject: [mg125453] Re: Map onto a column
 - From: Ray Koopman <koopman at sfu.ca>
 - Date: Wed, 14 Mar 2012 00:41:27 -0500 (EST)
 - Delivered-to: l-mathgroup@mail-archive0.wolfram.com
 - References: <jjmv20$cfr$1@smc.vnet.net>
 
On Mar 13, 1:04 am, Sly Pandemia <slypande... at gmail.com> wrote:
> Is there a neat way to map a function onto a specific column in an
> array?
>
> For example if I have
>
> a = {{1,2,3},{4,5,6},{7,8,9}}
>
> and I want to map f onto the second element in each row. I would
> normally use
>
> b = Map[MapAt[f,#,2]&,a]
>
> but this seems a bit awkward. I would expect to be able to use
>
> b = MapAt[f,a,{All,2}]
>
> but this appears to be illegal syntax.
>
> Is there any way to do what I want with a single Map/MapAt function?
When I started using Mathematica I avoided abbreviations such as
& /@ @ @@ @@@ /; /. //. etc, but now I prefer them to the long forms
in most situations. Here is your normal way, written more compactly,
which IMHO makes it not awkward:
  b = MapAt[f,#,2]&/@a
The remaining methods work only if f is Listable;
this step can be omitted if f is already Listable:
  SetAttributes[f,Listable]
If a has many rows then this can be much faster than your normal way:
  b = Transpose@MapAt[f,Transpose@a,2]
(From time to time I've been tempted to put T=Transpose in my init.m,
so I could write things like T@MapAt[f,T@a,2].)
This changes column 2 of a in place and returns the new column 2:
  a[[All,2] = f@a[[All,2]]
This sets b and returns the new column 2:
  b = a; b[[All,2]] = f@b[[All,2]]