Re: Finding and changing strings in a matrix
- To: mathgroup at smc.vnet.net
- Subject: [mg106776] Re: Finding and changing strings in a matrix
- From: Simon <simonjtyler at gmail.com>
- Date: Sat, 23 Jan 2010 07:32:52 -0500 (EST)
- References: <hjbv9l$2qj$1@smc.vnet.net>
Hi Jagra, the consecutive string problem can be solved with FixedPoint. Here's my solution: A single step looks like In[1]:= Position[myData,_String] Out[1]= {{5,2},{6,3},{7,1},{7,3},{8,1},{11,2},{11,3}} In[2]:= ReplacePart[myData,Thread[%->(myData[[Sequence@@(#-{1,0})]]&/@ %)]] Out[2]= {{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,10378.,5957.44},{5402.41,10536.9,5957.44},{5402.41,10494.7,-}, {-,10634.2,6002.92}, {5437.61,10638.1,6011.55}, {5397.86,10546.4,5957.43},{5412.88,10546.4,5957.43}} So just repeat until it no longer changes: In[3]:= newData = FixedPoint[Function[data,With[{pos=Position [data,_String]},ReplacePart[data,Thread[pos->(data[[Sequence@@(#- {1,0})]]&/@pos)]]]],myData]; Compare with In[4]:= MatrixForm/@{myData,newData} And all is good. The part that I'm not happy with is data[[Sequence@@(#-{1,0})]]&/@pos I couldn't get Part to do what I wanted... that's cause I should have used Extract: eg Extract[myData, Transpose[Transpose[pos] - {1, 0}]] Anyway, hope that helps Simon On Jan 22, 6:39 pm, Jagra <jagra24... at mypacks.net> wrote: > Hi everyone! > > 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 hope someone can help. Cool forum, lots to learn! Thanks. > > Jagra