6
$\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$
10
  • 6
    $\begingroup$ MapAt[f1, data, {All, 1}]? $\endgroup$
    – J. M.'s torpor
    May 24 '16 at 16:42
  • $\begingroup$ Map[Apply[{f[#1], ##2} &], data], if you insist... but J.M.'s approach is best. $\endgroup$ 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
8
$\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$
3
  • $\begingroup$ Whenever I do one of these solutions I get the resulting list $ {{a1,{b1}},{a2,{b2}},etc.}}$. How do I remove the resulting list around the second element? $\endgroup$ Apr 24 '20 at 14:48
  • $\begingroup$ @ElyEastman what input are you using. The code applies function to first part of each element $\endgroup$
    – ubpdqn
    Apr 25 '20 at 4:48
  • $\begingroup$ I realized I was using an incorrect input for my function. It was dividing by a list element, which would encapsulate bi in a list. $\endgroup$ Apr 26 '20 at 0:06

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.