我有大量文件(约1200个文件),每个文件都包含一个大表,其中包含有关地下水高度的数据。每个文件的意甲起始日期和长度都不同。例如,日期之间可能存在较大的数据间隙(例如,此类文件的一小部分):

Date        Height (cm)
14-1-1980   7659
28-1-1980   7632
14-2-1980   7661
14-3-1980   7638
28-3-1980   7642
14-4-1980   7652
25-4-1980   7646
14-5-1980   7635
29-5-1980   7622
13-6-1980   7606
27-6-1980   7598
14-7-1980   7654
28-7-1980   7654
14-8-1980   7627
28-8-1980   7600
12-9-1980   7617
14-10-1980  7596
28-10-1980  7601
14-11-1980  7592
28-11-1980  7614
11-12-1980  7650
29-12-1980  7670
14-1-1981   7698
28-1-1981   7700
13-2-1981   7694
17-3-1981   7740
30-3-1981   7683
14-4-1981   7692
14-5-1981   7682
15-6-1981   7696
17-7-1981   7706
28-7-1981   7699
28-8-1981   7686
30-9-1981   7678
17-11-1981  7723
11-12-1981  7803
18-2-1982   7757
16-3-1982   7773
13-5-1982   7753
11-6-1982   7740
14-7-1982   7731
15-8-1982   7739
14-9-1982   7722
14-10-1982  7794
15-11-1982  7764
14-12-1982  7790
14-1-1983   7810
28-3-1983   7836
28-4-1983   7815
31-5-1983   7857
29-6-1983   7801
28-7-1983   7774
24-8-1983   7758
28-9-1983   7748
26-10-1983  7727
29-11-1983  7782
27-1-1984   7801
28-3-1984   7764
27-4-1984   7752
28-5-1984   7795
27-7-1984   7748
27-8-1984   7729
28-9-1984   7752
26-10-1984  7789
28-11-1984  7797
18-12-1984  7781
28-1-1985   7833
21-2-1985   7778
22-4-1985   7794
28-5-1985   7768
28-6-1985   7836
26-8-1985   7765
19-9-1985   7760
31-10-1985  7756
26-11-1985  7760
20-12-1985  7781
17-1-1986   7813
28-1-1986   7852
26-2-1986   7797
25-3-1986   7838
22-4-1986   7807
27-5-1986   7785
24-6-1986   7787
26-8-1986   7744
23-9-1986   7742
22-10-1986  7752
1-12-1986   7749
17-12-1986  7758

我想计算5年的平均身高。因此,在示例14-1-1980 + 5年,14-1-1985 + 5年的情况下,...。每次平均值计算均需要不同的数据点数量。 5年后的日期很可能不会作为数据点出现在数据集中。因此,我认为我需要以某种方式告诉R在某个时间范围内取平均值。

我在互联网上搜索,但没有找到符合我需求的内容。许多有用的软件包,如uts,zoo,lubridate和传递的函数汇总。与其越来越接近解决方案,我越来越困惑于哪种方法最适合我的问题。

在此先多谢!

最佳答案

正如@vagabond指出的那样,您将需要将1200个文件合并到一个数据帧中(plyr软件包将使您可以执行以下简单操作:data.all <- adply(dir([DATA FOLDER]), 1, read.csv)

有了数据后,第一步就是将Date列转换为正确的POSIXct日期数据。现在,数据似乎是字符串,我们希望它们具有基础的数字表示形式(POSIXct可以做到):

library(lubridate)
df$date.new <- as.Date(dmy(df$Date))

       Date Height   date.new
1 14-1-1980   7659 1980-01-14
2 28-1-1980   7632 1980-01-28
3 14-2-1980   7661 1980-02-14
4 14-3-1980   7638 1980-03-14
5 28-3-1980   7642 1980-03-28
6 14-4-1980   7652 1980-04-14

请注意,date.new列看起来像字符串,但实际上是Date数据,可以用数字运算(加法,比较等)进行处理。

接下来,我们可以构建一组日期周期,以计算其平均值。您的示例提到了5年,但是根据您提供的数据,这并不是一个非常说明性的示例。因此,我在这里创建从1980年1月14日到1985年1月14日之间每天的1年周期
date.start <- as.Date(as.Date('1980-01-14') : as.Date('1985-01-14'), origin = '1970-01-01')
date.end <- date.start + years(1)
dates <- data.frame(start = date.start, end = date.end)

       start        end
1 1980-01-14 1981-01-14
2 1980-01-15 1981-01-15
3 1980-01-16 1981-01-16
4 1980-01-17 1981-01-17
5 1980-01-18 1981-01-18
6 1980-01-19 1981-01-19

然后,我们可以使用dplyr包遍历此数据帧的每一行,并计算Height的汇总平均值:
library(dplyr)
df.mean <- dates %>%
    group_by(start, end) %>%
    summarize(height.mean = mean(df$Height[df$date.new >= start & df$date.new < end]))

       start        end height.mean
      <date>     <date>       <dbl>
1 1980-01-14 1981-01-14    7630.273
2 1980-01-15 1981-01-15    7632.045
3 1980-01-16 1981-01-16    7632.045
4 1980-01-17 1981-01-17    7632.045
5 1980-01-18 1981-01-18    7632.045
6 1980-01-19 1981-01-19    7632.045

08-24 15:10