[Date Index]
[Thread Index]
[Author Index]
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
Prev by Date:
**Re: looping**
Next by Date:
**Re: Re: Re: Replace list element**
Previous by thread:
**Re: Finding and changing strings in a matrix**
Next by thread:
**Crash when using Dot on matrices, v 6.0.2**
| |