1
$\begingroup$
dataset={<|"type"->"row_1","A"->1.338275`*^6,"B"->0.|>,<|"type"->"row_2","A"->1.318498`*^6,"B"->1.1498`*^6|>,<|"type"->"row_3","A"->38084.`,"B"->35557.`|>,
<|"type"->"row_5","A"->181796.`,"B"->0.`|>,<|"type"->"row_4","A"->471946.`,"B"->449778.`|>,
<|"type"->"row_2","A"->1.516415`*^6,"B"->1.266298`*^6|>,<|"type"->"row_3","A"->44514.`,"B"->44398.`|>,
<|"type"->"row_1","A"->1.346733`*^6,"B"->1.16753`*^6|>,<|"type"->"row_4","A"->533791.`,"B"->492312.`|>,<|"type"->"row_5","A"->228284.`,"B"->0.`|>}//Dataset

I want to replace 0. value in [row_5,B] become value of [row_5,A], and the value is changing in many rows, and I don't like to type it {0.0->1.516*10^6}

One solution of mine is

1.select row_5 lines, and split the data in parts 2=part1,part2, 
2.change part1[with row_5] modifiy row B by rowA
3.combine part1 and part2

and I do this in the association, not the dataset.

enter image description here

enter image description here

$\endgroup$
  • $\begingroup$ Like this? ReplacePart[dataset, {{2, "a"}, {5, "a"}} -> y] $\endgroup$ – Jason B. Apr 12 '16 at 12:37
  • $\begingroup$ @JasonB yes, may be values of y is y1, y2, also some ways like Query, dataset[All, something] is welcome $\endgroup$ – HyperGroups Apr 12 '16 at 12:38
2
$\begingroup$

To change all rows of type "row_5" to that the "B" value is replaced with the corresponding "A" value, we can write:

dataset[All, <| #, "B" -> Replace[#type, {"row_5" -> #A, _ -> #B}] |> &]

dataset screenshot

If we only want to change the cases where the "B" value is zero, we can add that as an extra condition:

dataset[All, <| #, "B" -> Replace[#type, {"row_5" :> #A /; #B == 0., _ -> #B}] |>&]

If we wanted to replace all zero values in the B column with the corresponding A value, we could do this:

dataset[All, <| #, "B" -> Replace[#B, 0. -> #A] |> &]

dataset screenshot

$\endgroup$
  • $\begingroup$ Hi, yes, but sometimes, it's not 0. but 1.15*10^100, and maybe not so easy to type it rightly, since the table is large,some rows are hidden, and If some 0.0 is not in type=row_5, I don't want it to be replaced. $\endgroup$ – HyperGroups Apr 12 '16 at 14:29
  • $\begingroup$ So you want to change all row_5 entries, even when the value is not zero? $\endgroup$ – WReach Apr 12 '16 at 14:32
  • $\begingroup$ yes, that's the real purpose, better if could do a check, if value of [row_5,B] is 0, then replaced by [row_5,A] $\endgroup$ – HyperGroups Apr 12 '16 at 14:34
  • $\begingroup$ ha, I find it , thanks. dataset[All,<|#,"B"->If[#type=="row_5",#A,#B]|>&] $\endgroup$ – HyperGroups Apr 12 '16 at 14:40
2
$\begingroup$

Probably more than one way to do this, but scrolling through the documentation I found this,

dataset[All,{n->f}] selectively maps $f$ onto the $n^{th}$ column

What you want to do is map a replacement rule on to the "a" column,

dataset[All, {"a" -> (# /. {2 -> y1, 5 -> y2} &)}]

enter image description here

$\endgroup$
  • $\begingroup$ sorry, I changed the dataset and make the problem clearer $\endgroup$ – HyperGroups Apr 12 '16 at 14:08
  • $\begingroup$ Anyway, thanks, I find the answer, via WReach's answer. $\endgroup$ – HyperGroups Apr 12 '16 at 14:41

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.