将条件和从FORTRAN转换为R

将条件和从FORTRAN转换为R,r,fortran,R,Fortran,我正在将FORTRAN代码翻译成R,并且被一个条件和所困扰 我的代码的一些上下文: 我在观察每小时表面上的大量堆积物和雨水清洁表面。如果雨水低于1.5 cm的阈值,则对数小时内的质量累积进行汇总,但如果雨水高于1.5 cm的阈值,则清除质量累积并重置为零。在接下来的几个小时内,该过程重复进行,总质量累积量达到1.5以上,然后将质量累积量设置回零 所以在FORTRAN中,我将逐行遍历数组(使用DO循环),并计算该小时的总质量累积,“mtot”。如果该小时内经历的相应降雨小于1.5 cm,则我将该m

我正在将FORTRAN代码翻译成R,并且被一个条件和所困扰

我的代码的一些上下文: 我在观察每小时表面上的大量堆积物和雨水清洁表面。如果雨水低于1.5 cm的阈值,则对数小时内的质量累积进行汇总,但如果雨水高于1.5 cm的阈值,则清除质量累积并重置为零。在接下来的几个小时内,该过程重复进行,总质量累积量达到1.5以上,然后将质量累积量设置回零

所以在FORTRAN中,我将逐行遍历数组(使用DO循环),并计算该小时的总质量累积,“mtot”。如果该小时内经历的相应降雨小于1.5 cm,则我将该mtot值相加为“msum”。如果降雨量超过1.5,则msum和mtot设置为零,因为此时表面在该小时内没有质量累积,并且之前的质量已被清除。然后,我进入下一个迭代,重新计算该小时的mtot,并重复相同的逻辑。因此,我将I+1小时的mtot存储在I小时的mtot上

以下是我的FORTRAN代码:

DO i = 1, 8760
    ...
    mtot = ...


    IF (rain_hourly(i) >= 1.5) THEN             ! did it rain, was the rain enough to clean the surface, threshold to clean is 1.5 cm an hour
        msum = 0.0
        mtot = 0.0
    ELSE                                        ! sum mass on surface if it didnt rain enough
        msum = msum + mtot
    END IF

    ...
END DO
我需要帮助的地方是将IF块转换为R。在R中,我一次计算每个小时的mtot,并为每个小时创建一个mtot数组。我想我正在寻找一个条件if,将值相加,直到在每小时mtot数组中看到的最后一个零。我对R还不熟悉,不知道如何接近它。我可以用FORTRAN想出很多不同的方法,但是就像我说的,我对R是新手,不太了解R基本上是如何思考的

我已经创建了一个表格来帮助更好地解释我正在尝试做什么。“每小时降雨量”列包含一小时内经历的降雨量,单位为厘米,回想一下,清洁表面的阈值为1.5厘米。每小时mtot列是每小时累积的质量量。请注意,如果每小时降雨量列满足1.5的阈值,则该小时的每小时mtot将被零覆盖。最后,如果未达到降雨阈值,则总和mtot列是同一行mtot与过去mtot的总和。请注意,包括在总额中的过去MTOT仅在最后一次达到降雨阈值之前返回

**每小时降雨量****每小时mtot****累计mtot**
1                         3                        3
1                         1                        4
1                         2                        6
1.5                  0 -> 1                        0
1                         2                        2
1.5                  0 -> 1                        0
1                         3                        3
1                         1                        4

1 1 5带有
数据的
。表
包这可以作为“一行程序”实现:

rleid(hourly.rain<1.5)
为低于或高于阈值的每一条值创建一个唯一的组id。在每个组内重新开始计算累积和。当达到或超过阈值时,与
rleid(hourly.rain<1.5)
相乘将强制结果变为零。因此,当强制为数字类型时,TRUE和FALSE分别变为1和0

资料
DF非常感谢您的帮助。我听过很多关于package data.table的功能的介绍。谢谢你带我去,谢谢你的反馈。
data.table
IMHO的优点是处理大数据集、分组、快速连接和紧凑代码时的速度和内存效率。你可以在网站上找到有用的介绍材料。
library(data.table)
data.table(DF)[, new := (hourly.rain < 1.5) * cumsum(hourly.mtot), 
               by = rleid(hourly.rain < 1.5)][]
   hourly.rain hourly.mtot summed.mtot new
1:         1.0           3           3   3
2:         1.0           1           4   4
3:         1.0           2           6   6
4:         1.5           1           0   0
5:         1.0           2           2   2
6:         1.5           1           0   0
7:         1.0           3           3   3
8:         1.0           1           4   4
9:         1.0           1           5   5
DF <- structure(list(hourly.rain = c(1, 1, 1, 1.5, 1, 1.5, 1, 1, 1), 
    hourly.mtot = c(3L, 1L, 2L, 1L, 2L, 1L, 3L, 1L, 1L), summed.mtot = c(3L, 
    4L, 6L, 0L, 2L, 0L, 3L, 4L, 5L)), .Names = c("hourly.rain", 
"hourly.mtot", "summed.mtot"), row.names = c(NA, -9L), class = "data.frame")