Мой ДФ такой:
> dput(df)
structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), x1 = c(173L,
185L, 190L, 231L, 267L, 185L, 190L, 233L, 260L), y1 = c(299L,
321L, 360L, 361L, 377L, 321L, 360L, 363L, 309L), x2 = c(260L,
230L, 230L, 172L, 233L, 230L, 231L, 267L, 260L), y2 = c(309L,
322L, 322L, 378L, 363L, 322L, 391L, 377L, 309L)), class = "data.frame",
row.names = c(NA,
-9L))
> df
ID x1 y1 x2 y2
1 1 173 299 260 309
2 1 185 321 230 322
3 1 190 360 230 322
4 2 231 361 172 378
5 2 267 377 233 363
6 2 185 321 230 322
7 3 190 360 231 391
8 3 233 363 267 377
9 3 260 309 260 309
с этими данными я хочу вычислить углы между векторами, используя myfun.
myfun <- function(x1, x2, y1, y2){
xl <- x2-x1 # array of vectors in X
yl <- y2-y1 # array of vectors in Y
cl <- (xl^2 + yl^2)^0.5
atang <- atan2(yl, xl) # angle in radians
pi <- 3.142857
angToDeg <- atang * 180/pi # convert radians to degree
if(angToDeg < 0){
angToDeg <- angToDeg + 180
}
return(angToDeg)
}
df$ang = myfun(df$x1, df$x2, df$y1, df$y2))
Я получил следующую ошибку:
Warning message:
In if (angToDeg < 0) { :
the condition has length > 1 and only the first element will be used.
Как я могу решить эту ошибку? и еще одна вещь, которую я хочу спросить,
что правильно использовать 180 в части с условием if (), потому что я видел, как некоторые люди используют 360 вместо 180 следующим образом. Это конкретный случай или как?
if(angle > 360){
angle <- angle-360
}
return(angle)
Заранее спасибо!