我正在将IDL中提供的一些代码“转换”为R。
有很多要素,我目前正在其中之一。
下面的代码广泛用于计算;
如果RelAA大于180,则应将值转换为360-[所述值];如果RelAA小于180,则应将值转换为180-[所述值]。
在IDL中,如下;
calculate relative azimuth angle (RelAzm)
RelAA = ABS((sazm) - (vazm))
index_gt180 = where(RelAA gt 180.d)
index_lt180 = where(RelAA lt 180.d)
RelAA[index_gt180] = 360.- RelAA[index_gt180]
RelAA[index_lt180] = 180.- RelAA[index_lt180]
我试图在R中使用ifelse函数,但该方法不起作用。
我也尝试使用以下内容,但似乎没有用。
relaa[relaa > 180] = 360 - relaa[relaa > 180]
relaa[relaa < 180] = 180 - relaa[relaa < 180]
任何想法都将不胜感激。
relaa[relaa > 180] = 360 - relaa[relaa > 180]
relaa[relaa < 180] = 180 - relaa[relaa < 180]
calculate relative azimuth angle (RelAzm)
RelAA = ABS((sazm) - (vazm))
index_gt180 = where(RelAA gt 180.d)
index_lt180 = where(RelAA lt 180.d)
RelAA[index_gt180] = 360.- RelAA[index_gt180]
RelAA[index_lt180] = 180.- RelAA[index_lt180]
预期结果将是校正值列表
答案 0 :(得分:0)
不确定我是否收到您的问题,但是如果我理解正确,那么您使用ifelse
命令的位置就正确了。
两个示例值:
relaa <- c(181,179)
现在应用ifelse
命令,您可以指定需要满足的条件(relaa > 180
),如果满足条件的情况(360 - relaa
)以及如果条件满足的情况未实现(180 - relaa
):
relaa2 <- ifelse(relaa > 180, 360 - relaa, 180 - relaa)
这将产生:
> relaa2
[1] 179 1
这是您要找的吗?
答案 1 :(得分:0)
我使用以下代码得到了答案;
relaa = ifelse(relaa[] > 180, 360 - relaa[], ifelse(relaa[] < 180, 180 - relaa[],
relaa[]))
但是,我现在遇到的问题是结果已变成数字。我需要保留原始的“栅格”格式。
有什么想法吗?
答案 2 :(得分:0)
请始终提供一些示例数据
library(raster)
relaa <- raster(nrow=10, ncol=10)
relaa <- init(relaa, "x") + 180
解决方案1
m <- relaa > 180
mT <- mask(relaa, m, maskvalue=TRUE)
mT <- 180 - mT
x <- cover(mT, 360-relaa)
解决方案2
y <- calc(relaa, function(x) ifelse(x >= 180, 360-x, 180-x))
解决方案3(使用未导出且未经大量测试的功能)
z <- raster:::.ifel(relaa >= 180, 360 - relaa, 180 - relaa)
解决方案4(不建议使用;因为它可能会导致内存问题)。您很接近,但是为了避免某些单元格值被两次更改,您的命令是错误的。
relaa[relaa < 180] = 180 - relaa[relaa < 180]
relaa[relaa > 180] = 360 - relaa[relaa > 180]