开发者

R: how to store a vector of vectors

开发者 https://www.devze.com 2023-01-24 17:37 出处:网络
I\'m trying to write a function to determine the euclidean distance between x (one point) and y (a set of n points).

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. 开发者_Python百科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?


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)


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
0

精彩评论

暂无评论...
验证码 换一张
取 消