获取R中特定数量的后续行的总和

时间:2016-08-02 20:47:34

标签: r

我必须在R中解决这个特定的问题。我有一个很大的列表,包含这种格式的列和行:

    Day_and_Time    Rain1_mm/min   Rain2_mm/min 
    01.12.10 18:01     0             0
    ..............  ....           ...
    02.12.10 01:00  0.03             0             
    02.12.10 01:01  0.03             0           
    02.12.10 01:02  0.01             0           
    02.12.10 01:03  0.05             0           
    02.12.10 01:04  0.03           0.1           
    02.12.10 01:05  0.04             0  
    ..............  ....           ...
    02.12.10 18:00     0             0

我想要做的是编写一个函数,该函数总结以下六行,并将结果作为新行返回。这意味着最后我有了一个新列表 - 例如:

    Day_and_Time           Rain1_mm/5min   Rain2_mm/5min 
    ..............         ....            ... 
    02.12.10 01:05         0.19            0.1           
    02.12.10 01:10         ....            ...
    ..............         ....            ...

有可能这样做吗?目标是将单位[mm / min]从第一列和第二列转换为[mm / 5min]。

非常感谢!

2 个答案:

答案 0 :(得分:0)

假设您将.csv文件中的数据作为数据框df阅读,问题的一种解决方法是使用rollapply包中的zoo来提供你是一个滚动的总和:

library(zoo)

ind_keep <- seq(1,floor(nrow(df)/5)*5, by=5)                        ## 1.
out <- sapply(df[,-1], function(x) rollapply(x,6,sum))              ## 2.
out <- data.frame(df[ind_keep+5,1],out[ind_keep,])                  ## 3.
colnames(out) <- c("Day_and_time","Rain1_mm/5min","Rain2_mm/5min")  ## 4.

注意:

  1. 在这里,我们定义了每隔5分钟对应的索引,我们希望在接下来的5分钟内保持滚动总和。
  2. 为每列应用滚动求和函数。
    • sapply的不是第一列的所有列上使用df。请注意,可以调整df[,-1]中指定的列索引,以便您只处理某些列。
    • 要应用的功能是来自rollapply包的zoo。附加参数是窗口5sum函数的宽度,以便执行滚动总和。 此时,out包含每分钟的滚动总和(超过5分钟),但我们只需要每5分钟一次。因此,
  3. 将原始Day_and_time中的df列与out合并,每5分钟仅保留一列。请注意,我们会在每个窗口中保留最后一个Day_and_Time
  4. 这只是重命名列。
  5. 使用MikeyMike的数据,

              Day_and_Time rain1 rain2
    1  2010-02-12 01:00:00  0.03  0.00
    2  2010-02-12 01:01:00  0.03  0.00
    3  2010-02-12 01:02:00  0.01  0.00
    4  2010-02-12 01:03:00  0.05  0.00
    5  2010-02-12 01:04:00  0.03  0.10
    6  2010-02-12 01:05:00  0.04  0.00
    7  2010-02-12 01:06:00  0.02  0.10
    8  2010-02-12 01:07:00  0.10  0.10
    9  2010-02-12 01:08:00  0.30  0.00
    10 2010-02-12 01:09:00  0.01  0.00
    11 2010-02-12 01:10:00  0.00  0.01
    

    这给出了:

    print(out)
    ##         Day_and_time Rain1_mm/5min Rain2_mm/5min
    ##1 2010-02-12 01:05:00          0.19          0.10
    ##2 2010-02-12 01:10:00          0.47          0.21
    

    注意结果的差异,这种方法假定您需要重叠窗口,因为您指定要在每5分钟标记的闭合间隔[i,i+5]之间对六个数字求和。

    要将上述内容扩展到每个[i, i+nMin]标记的关闭时间间隔nMin中的窗口:

    library(zoo)
    nMin <- 10      ## for example 10 minutes
    ind_keep <- seq(1, floor(nrow(df)/nMin)*nMin, by=nMin)
    out <- sapply(df[,-1], function(x) rollapply(x, nMin+1, sum))
    out <- data.frame(df[ind_keep+nMin, 1],out[ind_keep,])
    colnames(out) <- c("Day_and_time",paste0("Rain1_mm/",nMin,"min"),paste0("Rain2_mm/",nMin,"min"))
    

    为此,数据必须至少有2 * nMin + 1

    希望这有帮助。

答案 1 :(得分:0)

假设您希望这些组为0 - 5分钟,6 - 10分钟等,这应该可以为您提供所需的信息:

clang

数据

g++