Raul & Thomas, 

Thank you very much for your help. I wound up using Raul's brute force 
approach, which worked perfect for my small set of data (~1500 elements with 
about 500 missing values).

I did notice that Raul's explicit version gives a different answer from the 
brute force version.  The difference is that the explicit version substituted 
the larger existing value for a missing value that fell exactly between 2 
existing values.  

nearValBrute=: ({."1 {~ |: i."_1 <./)@:|@(-/ 1 i.@+ >./) 

inds=: [: i. 1 + {:
poss=: (,{.) {~ _1 0 +/ ] I. inds
nearValOrdered =: |:@poss {~"_1 [: (|: i."_1 <./) inds |@-"1 poss

nearValExplicit=: 3 :0
  inds=. i. 1 + {: y
  poss=. (y,{.y) {~ 0 _1 +/ y I. inds
  (|:poss) {~"_1 (|: i."_1 <./) |inds -"1 poss
)

   (nearValBrute,nearValOrdered,:nearValExplicit) 1 2 5 9
1 1 2 2 5 5 5 5 9 9
1 1 2 2 5 5 5 5 9 9
1 1 2 2 5 5 5 9 9 9

Thanks again.

Ken

-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Raul Miller
Sent: Thursday, September 29, 2011 8:59 AM
To: Programming forum
Subject: Re: [Jprogramming] replacing missing values with closest neighbor

On Thu, Sep 29, 2011 at 6:18 AM, Raul Miller <[email protected]> wrote:
> On Wed, Sep 28, 2011 at 10:44 PM, Lettow, Kenneth <[email protected]> 
> wrote:
>>   sa=: 1 2 5 9
> ...
>>   NB. nearest value in sa.  The desired result should be:
>>   desiredresult=: 1 1 2 2 5 5 5 5 9 9
>
> Here's a brute force approach:
>
>   ({."1 {~ |: i."_1 <./)@:|@(-/ 1 i.@+ >./) 1 2 5 9
> 1 1 2 2 5 5 5 5 9 9


Here's a version that relies on the data being ordered:

inds=: [: i. 1 + {:
poss=: (,{.) {~ _1 0 +/ ] I. inds
nearVal=: |:@poss {~"_1 [: (|: i."_1 <./) inds |@-"1 poss

   nearVal 1 2 5 9
1 1 2 2 5 5 5 5 9 9

Or, an explicit version (which, in effect, caches the function results
within an execution):

nearVal=:3 :0
  inds=. i. 1 + {: y
  poss=. (y,{.y) {~ 0 _1 +/ y I. inds
  (|:poss) {~"_1 (|: i."_1 <./) |inds -"1 poss
)

-- 
Raul
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to