1

Consider the an example table

TableTest = 
  Table[{{521, 1, 1}, {18000, 2, 1}, {-423, 1, 111}, {-13, 435, 
     2}, {-421, 12, 39}, {321, 11, 34}, {-211, 994, 324}}, {i, 1, 5, 
    1}];

It has the form of "blocks":

TabTest[[1]]

enter image description here

Could you please tell me how to remove the rows with -423, and move the row -421 to the placement of the removed -423 row, such that the modified blocks look like

enter image description here

Edit: I have found a solution. It is not very elegant but works fast:

TableCut1 = Drop[TableTest, None, {3, 7}]
TableCut2 = Drop[Drop[TableTest, None, {1, 3}], None, {2, 4}];
TableCut3 = Drop[Drop[TableTest, None, {1, 4}], None, {2, 3}];
TableCut4 = Drop[TableTest, None, {1, 5}];
TableTestModified = Transpose@
   Join[Transpose@TableCut1, Transpose@TableCut3, Transpose@TableCut2,
     Transpose@TableCut4];
John Taylor
  • 5,701
  • 2
  • 12
  • 33

3 Answers3

1
ttest = Table[{{521, 1, 1}, {18000, 2, 1}, {-423, 1, 111}, {-13, 435, 
     2}, {-421, 12, 39}, {321, 11, 34}, {-211, 994, 324}}, {i, 1, 5, 
    1}];

enter image description here

Define a utility function:

Clear[f, k, pos1, pos2];
f[mat_List] := Module[{pos1, pos2, k},
  k = mat;
  pos1 = Flatten@Position[mat, {-423, _, _}];
  pos2 = Flatten@Position[mat, {-421, _, _}];
  (*Echo[k];
  Echo[pos1];
  Echo[pos2];*)
  k[[pos1]] = k[[pos2]];
  k[[pos2]] = Nothing;
  (*Echo[k];*)
  k
  ]

(new = f /@ ttest) // MatrixForm

enter image description here

Syed
  • 52,495
  • 4
  • 30
  • 85
1

You can do this using "ReplacePart" and the 3 argument form of of "Drop":

t = ReplacePart[TableTest, {i_, 3} :> TableTest[[i, 5]]];
t = Drop[t, None, {5}];
t[[1]]
{{521, 1, 1}, {18000, 2, 1}, {-421, 12, 39}, {-13, 435, 2}, {321, 11, 

34}, {-211, 994, 324}}

Daniel Huber
  • 51,463
  • 1
  • 23
  • 57
1

Update: From the method used in OP, it looks like the positions to be modified are known. In that case, we get the desired result with a simple application of Part:

TableTest4 = TableTest[[All,{1,2,5,4,6,7}]];

TableTest4 == TableTestModified

True

Original answer:

You can use SubsetReplace or SequenceReplace as follows:

TableTest2 = SubsetReplace[{a : {-423, __}, b : {-421, __}} :>  b]] /@ TableTest;

TableTest3 = SequenceReplace[{a:{-423, __}, b___, c:{-421, __}} :> Sequence[c, b]] /@ TableTest;

TableTest2 == TableTest3 == TableTestModified

True
Grid[{Style[#, 16] & /@ {"TableTest", "TableTest2", "TableTest3"}, 
    MatrixForm[#, TableDirections -> {Column, Column}] & /@ 
      {TableTest, TableTest2, TableTest3}}, 
    Dividers -> {None, {{-1, 1, -1}}}]

enter image description here

kglr
  • 394,356
  • 18
  • 477
  • 896