4
$\begingroup$

Let's say I have some data:

data={{a1,b1},{a2,b2},{a3,b3},{a4,b4},...}

and I would like to apply the function:

f1[x_]=x*5 to every a_i element.

How can I do this?

The best solution I've found so far is to do:

MapAt[f1, data, {{1, 1}, {2, 1}, {3, 1}, {4, 1}...}]

Up to the length of my data, but I'm sure there's a more efficient solution for this.

$\endgroup$
  • 5
    $\begingroup$ MapAt[f1, data, {All, 1}]? $\endgroup$ – J. M. is away May 24 '16 at 16:42
  • $\begingroup$ Map[Apply[{f[#1], ##2} &], data], if you insist... but J.M.'s approach is best. $\endgroup$ – Emilio Pisanty May 24 '16 at 16:44
  • $\begingroup$ Transpose@{f1[#1], #2} & @@ Transpose@data If your f1 is Listable (and yours is ) that can give you significant speed increase. $\endgroup$ – BlacKow May 24 '16 at 16:50
  • 1
    $\begingroup$ also: {f1@#, #2} & @@@ data $\endgroup$ – kglr May 24 '16 at 23:44
  • 2
    $\begingroup$ @BlacKow #1 and # are equivalent. $\endgroup$ – LLlAMnYP May 25 '16 at 7:16
6
$\begingroup$

There are a number of ways (if I understand aim),e.g.:

lst = data = {{a1, b1}, {a2, b2}, {a3, b3}, {a4, b4}};
lst /. {x_, y_} :> {f[x], y}
MapAt[f, lst, {All, 1}]
{f@#1, #2} & @@@ lst
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.