Hello,

Thanks for the dataset, Arun, I could test my function and it was still wrong (apologies to the op).
Now I think I've got it.

is.border <- function(idx, DF){
    i1 <- DF$ix %in% (DF$ix[idx] + c(-1, 1)) & DF$iy == DF$iy[idx]
    i2 <- DF$iy %in% (DF$iy[idx] + c(-1, 1)) & DF$ix == DF$ix[idx]
    any(DF$country[idx] != DF$country[i1 | i2])
}

brdr <- sapply(Mydata$idxy, is.border, Mydata)
Mydata$border <- as.integer(brdr)


Tested it and it all went allright.

Hope this helps,

Rui Barradas

Em 21-10-2012 15:36, arun escreveu:
HI,
I am not sure whether this is what you want.
Mydata<-read.table(text="
  idxy    ix    iy    country    col5
  1        1    1    c1            x1
  2        1    2    c1            x2
  3        1    3    c1            x3
  4        2    4    c1            x4
  5        2    4    c2            x5
  6        2    5    c2            x6
  7        3    5    c3            x7
  8        3    5    c3            x8
  9        3    5    c3            x9
",sep="",stringsAsFactors=FALSE,header=TRUE)
country1<-as.numeric(gsub(".*(\\d+)","\\1",Mydata$country))
  
Mydata1<-data.frame(ix=abs(diff(c(Mydata$ix[2],Mydata$ix))),iy=abs(diff(c(Mydata$iy[2],Mydata$iy))),country=abs(diff(c(country1[2],country1))))
  Mydata2<- Mydata[apply(Mydata1,1,function(x) 
all(!duplicated(x)|!duplicated(x,fromLast=TRUE))),]
  Mydata2$border<-1
res<-merge(Mydata,Mydata2,by.x=c("idxy","ix","iy","country","col5"),by.y=c("idxy","ix","iy","country","col5"),all.x=TRUE)
  res
#  idxy ix iy country col5 border
#1    1  1  1      c1   x1      1
#2    2  1  2      c1   x2      1
#3    3  1  3      c1   x3      1
#4    4  2  4      c1   x4      1
#5    5  2  4      c2   x5      1
#6    6  2  5      c2   x6      1
#7    7  3  5      c3   x7      1
#8    8  3  5      c3   x8     NA
#9    9  3  5      c3   x9     NA





----- Original Message -----
From: Andrew Crane-Droesch <andre...@gmail.com>
To: r-help@r-project.org
Cc:
Sent: Saturday, October 20, 2012 3:36 AM
Subject: [R] Help with programming a tricky algorithm

Hi All,

I'm a little stumped by the following problem.  I've got a dataset with the 
following structure:

idxy    ix    iy    country    (other variables)
1        1    1    c1            x1
2        1    2    c1            x2
3        1    3    c1            x3
.        .        .       .            .

3739    55    67    c7        x3739
3740    55    68    c7        x3740

where ix and iy are interger-valued indices of the actual x and y coordinates 
for the gridded data

I want to define a "border" variable that equals 1 if the cell north, east, 
west, or south of it has a different value of the country variable.  So, for the row with 
idxy = 1, border would equal 1 if there is any idxy with country !=c1 and ix = 2 (or 
zero) or iy = 2 (or zero).

Any thoughts?

Thanks!
Andrew

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to