Re: Finding and changing strings in a matrix

*To*: mathgroup at smc.vnet.net*Subject*: [mg106793] Re: Finding and changing strings in a matrix*From*: Albert Retey <awnl at gmx-topmail.de>*Date*: Sat, 23 Jan 2010 07:36:14 -0500 (EST)*References*: <hjbv9l$2qj$1@smc.vnet.net>

Hi, > I have a matrix with {500, 20} dimensions. Some random positions in > each column have text strings in them instead of numbers. While it > can happen, the text strings do not typically appear across an entire > row of data. > > I need to find the text strings and replace them by the values > immediately above them. In the case where the matrix has consecutive > text strings I need to replace them with the first number above the > run of strings. > > Here's a part of the data file so you get the idea of what I start > with: > > myData ={{5217.61, 10163.8, 5844.44}, {5196.81, 10142.1, 5831.21}, > {5293.99, > 10183.5, 5930.53}, {5328.66, 10378., 5945.69}, {5372.38, "-", > 5957.44}, {5402.41, 10536.9, "-"}, {"-", 10494.7, "-"}, {"-", > 10634.2, 6002.92}, {5437.61, 10638.1, 6011.55}, {5397.86, 10546.4, > 5957.43}, {5412.88, "-", "-"}}; > > myData // MatrixForm > > I want to get rid of all "-"s and replace them with the numbers most > directly above them. > > I guess I could do this with loops, but that seems like a waste of > Mathematica's power. > > I've tried using Rest[myData] and Most[myData] then using Position to > identify where one of the matrices had strings and the other didn't > then using that to replace the strings in the original data. But I > run into a snag when I have consecutive strings. I think that this is one of the cases where working explicitly with indexes is clearer than any of the functional constructs I can think of achieving what you need. Using a Table as below you should also not suffer from extreme inefficiencies: Table[ If[ Not[NumericQ[myData[[i, k]]]], myData[[i - 1, k]], myData[[i, k]] ], {i, Length[myData]}, {k, Length[myData[[1]]]} ] One thing you should never forget: there is not value to use functional or rule based constructs per se, but most often you can use them to get concise, clear, error prone and efficient code in Mathematica. If not, there is absolutely no reason to not use some of the less functional constructs, and especially using Table and Do will often result in code that is just as "good". > I hope someone can help. Cool forum, lots to learn! Thanks. IMHO it is the best if not the only way to learn Mathematica :-) hth, albert