Hi,

Try this:
mat1: 1st matrix
mat2: 2nd matrix

fun1<- function(x){
    big<- x>0.8*max(x) 
    n<- length(big)
    startRunOfBigs<- which(c(big[1],!big[-n] & big[-1]))
    endRunOfBigs<- which(c(big[-n] & !big[-1], big[n]))
    index<- vapply(seq_along(startRunOfBigs),function(i) 
which.max(x[startRunOfBigs[i]:endRunOfBigs[i]])+startRunOfBigs[i]-1L,0L)
     index<-ifelse(sum(is.na(match(index,c(1,12))))==0 & 
x[index]!=max(x[index]), NA,index)
    data.frame(Index=index[!is.na(index)],Value=x[index[!is.na(index)]])
     }

fun2<- function(mat){
       vec1<- sapply(seq_len(ncol(mat)),function(i){
         x<-mat[,i]
        x1<-fun1(mat[,i])
         x2<- x1$Index[which.min(abs(x1$Index-length(x)))]
        })
      
      indx<- if(abs(diff(vec1)) > (nrow(mat)/2)){
                nrow(mat)-abs(diff(vec1))
        }
             else(abs(diff(vec1)))
       res1<-sapply(seq(indx),function(i){
        x3<- mat[,2]
        indx1<-seq(length(x3)-i)
        indx2<-c(setdiff(seq_along(x3),indx1),indx1)
        sum(abs(mat[,1]-x3[indx2]))
        })                   
        res2<- sum(res1)
    res2                
}
     

fun2(mat1)
#[1] 40.93609
 fun2(mat2)
#[1] 12.79153


#Using the method that I send yesterday: (just to confirm the calculation for 
mat1.  It won't work with mat2)

sum(sapply(which.max(rev(mat1[,2])):which.max(mat1[,1]),function(i) 
{x<-seq(nrow(mat1))-i; 
x[x<=0]<-seq(max(x)+1,nrow(mat1),1);sum(abs(mat1[,1]-mat1[x,2]))}))
#[1] 40.93609


A.K.





----- Original Message -----
From: eliza botto <eliza_bo...@hotmail.com>
To: "r-help@r-project.org" <r-help@r-project.org>
Cc: 
Sent: Thursday, May 23, 2013 4:29 PM
Subject: [R] Distance calculation

Dear useRs,
i have the following data arranged in three columns

structure(c(0.492096635764151, 0.433332688044914, 0.521585941816778, 
1.66472272302545, 2.61878329527404, 2.19154489521664, 0.493876245329722, 
0.4915787202584, 0.889477365620806, 0.609135860199222, 0.739201878930367, 
0.854663750519518, 2.06195904001605, 1.41493262330451, 1.35748791897328, 
1.19490680241894, 0.702488756183322, 0.338258418490199, 0.123398398622741, 
0.138548982660226, 0.16170889185798, 0.414543218677095, 1.84629295875002, 
2.24547399004563), .Dim = c(12L, 2L))

The distance is to be calculated by subtracting each value of each column from 
the corresponding column value in the following way
=>The column values are cyclic. For example, after row 12 there is once again 
row 1. So, in a way, row 3 is more closer to row 12 than to row 8. 
=> The peak value is the maximum value for any column. the values falling in 
the range of 80% of the maximum values can also be considered as maximum value 
provided they are not falling immediatly next to eachother. 
=> If we plot column 1 and column 2 the peak value of column 1 is at 5th grade 
of x-axis and for column 2 its in 12th. For column 2 at x=1 the value is very 
close to that of the value at x=12 (in 80% range of it), but still it can 
considered as peak value as it is immediatly falling next to the maximum value. 
Now The peaks are moved towards eachother in a shortest possible way unless 
maximum values are under eachother
more precisely,
column 1 
1 2 3 4 5(max) 6 7 8 9 10 11 12        column 2 
1 2 3 4 5 6 7 8 9 10 11 12(max)
Now distance is measured in the following way
column 1 
1 2 3 4 5(max) 6 7 8 9 10 11 12        column 2 
12(max) 1 2 3 4 5 6 7 8 9 10 11 
a>sum(abs(col1-col2))
==column 1 
1 2 3 4 5(max) 6 7 8 9 10 11 12        column 2 
11 12(max) 1 2 3 4 5 6 7 8 9 10  
b>sum(abs(col1-col2))==column 1 
1 2 3 4 5(max) 6 7 8 9 10 11 12        column 2 
10 11 12(max) 1 2 3 4 5 6 7 8 9 
c>sum(abs(col1-col2))==column 1 
1 2 3 4 5(max) 6 7 8 9 10 11 12        column 2 
9 10 11 12(max) 1 2 3 4 5 6 7 8 
d>sum(abs(col1-col2))==column 1 
1 2 3 4 5(max) 6 7 8 9 10 11 12        column 2 
8 9 10 11 12(max) 1 2 3 4 5 6 7 
e>sum(abs(col1-col2))

total distance= a+b+c+d+e
For the following two column it should work the following way

structure(c(0.948228727226247, 1.38569091844218, 0.910510759802679, 
1.25991218521949, 0.993123416952421, 0.553640392997634, 0.357487763503204, 
0.368328033777003, 0.344255688489322, 0.423679560916755, 1.32093576037521, 
3.13420679229785, 0.766278117577654, 0.751997501086888, 0.836280758630117, 
1.188156460303, 1.56771616670373, 1.15928168139479, 0.522523036011874, 
0.561678840701488, 1.11155735914479, 1.26467106348848, 1.09378883406298, 
1.17607018089421), .Dim = c(12L, 2L))
column 1 
1 2 3 4 5 6 7 8 9 10 11 12(max)        column 2 
1 2 3 4 5(max) 6 7 8 9 10(max) 11 12
Now as for column 2, 10th value is closer to col1 maximum value, therefore 
distance is measured in the following way
column 1 
1 2 3 4 5 6 7 8 9 10 11 12(max)        column 2 
12 1 2 3 4 5 6 7 8 9 10(max) 11
a>sum(abs(col1-col2))
---
column 1 
1 2 3 4 5 6 7 8 9 10 11 12(max)        column 2 
11 12 1 2 3 4 5 6 7 8 9 10(max) 
b>sum(abs(col1-col2))
total distance=a+b
How can i do it??
Thankyou very very much in advance
Elisa
                          
______________________________________________
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