对栅格使用多个ifelse语句

时间:2019-09-04 01:08:32

标签: r

我想根据y和x的原始条件,对相同的2个栅格文件应用略有不同的方程式:

  1. 如果y为正且x为负:atan2(y,x)* 180 / pi

  2. 如果y为负且x为负,则atan2(y,x)* 180 / pi + 90

  3. 如果y为负且x为负,则atan2(y,x)* 180 / pi + 180

  4. 如果y为正且x为负,则atan2(y,x)* 180 / pi + 270

我尝试将多个ifelse语句分组为一个函数:

y <- raster(y) #formal raster class layer
x <- raster(x) #formal raster class layer

quad <- if(y>0 & x>0){
    (atan2(y,x)*180/pi)
}else{
    if(y<0 & x>0)
    ((atan2(y,x)*180/pi) +90)
}else{
    if(y<0 & x>0)
    ((atan2(y, x)*180/pi) +180)
}else{
    if (y>0 & x<0)
    ((atan2(y,x)*180/pi) +270)

错误:“}”中出现意外的'}' 错误:出现意外的“ else”: ”(((atan2(y,x)* 180 / pi)+90) }其他”

它也不会创建新对象。

1 个答案:

答案 0 :(得分:1)

总是包含一些示例数据

library(raster)
r <- raster(nrow=10, ncol=10)
x <- setValues(r, sample(-180:180,ncell(r),replace=T))
y <- setValues(r, sample(-90:90,ncell(r),replace=T))

解决此类问题的通用方法是编写一个函数,对其进行测试,然后将其与calcoverlay一起使用

fq <- function(x, y) {
    ifelse(y>0 & x>0, atan2(y,x)*180/pi, 
        ifelse(y<0 & x>0, atan2(y,x)*180/pi +90, 
        ifelse(y<0 & x<0, atan2(y,x)*180/pi +180,
        atan2(y,x)*180/pi +270)))
}

q <- overlay(x, y, fun=fq)

另一种更简洁的编写方式

fq2 <- function(x, y) {
    z <- ifelse(y>0, ifelse(x>0, 0, 270), ifelse(x>0, 90, 180))
    atan2(y, x) * 180/pi + z
}
q2 <- overlay(x, y, fun=fq2)

或者这样

fz <- function(x, y) {
    z <- ifelse(y>0, ifelse(x>0, 0, 270), ifelse(x>0,90, 180))
}
z <- overlay(x, y, fun=fz)
q3 <- atan2(y, x) * (180/pi) + z

或使用隐藏的尚不支持的 raster:::.ifel方法

zz <- raster:::.ifel(y>0, raster:::.ifel(x>0, 0, 270), raster:::.ifel(x>0,90, 180))
q4 <- atan2(y, x) * (180/pi) + zz