0

我有以下功能:

calculateAngle <- function(x, y)
{
    v <- c(x, y)
    a <- c(1, 0)

    theta <- acos( sum(a*v) / ( sqrt(sum(a * a)) * sqrt(sum(v * v)) ) )

    if(v[[2]] < 0)
    {
        return(-1 * theta)
    }
    else
    {
        return(theta)
    }
}

它采用 x 和 y 值并计算该向量与 1、0 向量之间的角度。现在,此函数在这些示例中可以正常工作:

> calculateAngle(0, 1)
[1] 1.570796
> calculateAngle(0, -1)
[1] -1.570796
> calculateAngle(0, -10)
[1] -1.570796
> calculateAngle(rnorm(1), rnorm(1))
[1] -0.2600444

但是当我尝试将数据框的列传递给它时,当我想要的是每行的角度时,它会返回一个值。

df <- data.frame(x=rnorm(10), y=rnorm(10))

df$angle <- calculateAngle(df$x, df$y)

帮助表示赞赏。

4

2 回答 2

4

(警告:这是一个懒惰的答案,因为我不想在这上面花费超过 5 秒!)

calculateAnglev <- Vectorize(calculateAngle,c('x','y'))
> calculateAnglev(runif(2),runif(2))
[1] 0.2738694 0.8039875

也就是说,在性能方面,这不应被误认为是真正矢量化的替代品。

于 2013-03-08T20:02:21.203 回答
2

您的代码theta过于复杂,例如您的 termsum(sqrt(a*a))始终为 1,并且sum(a*v)始终为x。此外sum(v*v) = x^2+y^2,使用这种形式,我们得到了也适用于向量参数的版本:

calculateAngle <- function(x, y)
{
   a <- c(1, 0)
   theta <- acos( x / sqrt(x^2+y^2))
   sign(y)*theta
}
于 2013-03-08T20:06:22.603 回答