Alexander Engelhardt
Alexander Engelhardt

Reputation: 1712

R: how to store a vector of vectors

I'm trying to write a function to determine the euclidean distance between x (one point) and y (a set of n points). How should I pass y to the function? Until now, I used a matrix like that:

     [,1] [,2] [,3]
[1,]    0    2    1
[2,]    1    1    1

Which would pass the points (0,2,1) and (1,1,1) to that function.

However, when I pass x as a normal (column) vector, the two variables don't match in the function. I either have to transpose x or y, or save a vector of vectors an other way.

My question: What is the standard way to save more than one vector in R? (my matrix y)
Is it just my y transposed or maybe a list or dataframe?

Upvotes: 4

Views: 7045

Answers (2)

IRTFM
IRTFM

Reputation: 263301

The apply function with the margin argument = 1 seems the most obvious:

> x
     [,1] [,2] [,3]
[1,]    0    2    1
[2,]    1    1    1
> apply(x , 1, function(z) crossprod(z, 1:length(z) )  )
[1] 7 6
> 2*2+1*3
[1] 7
> 1*1+2*1+3*1
[1] 6

So if you wanted distances then square-root of the crossproduct of the differences to a chose point seems to work:

> apply(x , 1, function(z) sqrt(sum(crossprod(z -c(0,2,2), z-c(0,2,2) ) ) ) )
[1] 1.000000 1.732051

Upvotes: 0

mbq
mbq

Reputation: 18628

There is no standard way, so you should just pick the most effective one, what on the other hand depends on how this vector of vectors looks just after creation (it is better to avoid any conversion which is not necessary) and on the speed of the function itself.

I believe that a data.frame with columns x, y and z should be pretty good choice; the distance function will be quite simple and fast then:

d<-function(x,y) sqrt((y$x-x[1])^2+(y$y-x[2])^2+(y$z-x[3])^2)

Upvotes: 1

Related Questions