我有以下功能:
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)
非常感谢帮助。
答案 0 :(得分:4)
(警告:这是一个懒惰的答案,因为我不想在这上面花费超过5秒!)
calculateAnglev <- Vectorize(calculateAngle,c('x','y'))
> calculateAnglev(runif(2),runif(2))
[1] 0.2738694 0.8039875
即。在性能方面,这不应该被误认为是真正的矢量化的替代品。
答案 1 :(得分:2)
theta
的代码过于复杂,例如,您的字词sum(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
}