2

大家好,

我有一个包含许多数据列的 data.frame,但是,对于每一行,我只对这些列的子集感兴趣。我想使用另一个特定值来标识我感兴趣的列。然后我将取感兴趣的列和前 5 个列的平均值。

我的 data.frame 包括点位置、收集月份和从 1996-2012 年每个点的一组月度栅格中提取的值。对于每个点,我都对收集日期之前的六个月平均值感兴趣,例如。如果我在 200106 (06/2001) 记录了一个变量,我想要 200101-200106 的栅格平均值。

收集日期值的编码与对应于同一月份提取的值的列名称相同。

给定我的收集日期,有没有办法识别我感兴趣的列?

我的 data.frame 看起来像:

    df <- data.frame(lat = c(-34, -34.5, -35, -35.5, -36, -36.5, -37),
                     lon = c(144, 144.5, 145, 145.5, 146, 146.5, 147),
                     dt = c('x200106', 'x200107', 'x200108', 'x200109', 'x200110', 'x200111', 'x200112'),
                     x200101 = c(1, 2, 3, 4, 5, 6, 7),
                     x200102 = c(10, 20, 30, 40, 50, 60, 70),
                     x200103 = c(1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5),
                     x200104 = c(11, 12, 13, 14, 15, 16, 17),
                     x200105 = c(11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5),
                     x200106 = c(1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7),
                     x200107 = c(21, 22, 23, 24, 25, 26, 27),
                     x200108 = c(10, 20, 30, 40, 50, 60, 70),
                     x200109 = c(1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5),
                     x200110 = c(11, 12, 13, 14, 15, 16, 17),
                     x200111 = c(11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5),
                     x200112 = c(1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7))

给定 dt (date) 我可以得到相应列的六个月平均值吗?

我不知道如何继续,我想象某种数据转换,但不知道从哪里开始。任何帮助将不胜感激。非常感谢!

干杯,亚当

4

1 回答 1

1

您要做的主要事情是重塑您的数据,使其为长格式,并转换日期,以便您可以对它们执行算术运算。这就是我们在这里所做的:

library(reshape2)
df.mlt <- melt(df, id.vars=c("lat", "lon", "dt"))
df.mlt[c("dt", "variable")] <- lapply(df.mlt[c("dt", "variable")], function(x) as.Date(paste0(x, "01"), format="x%Y%m%d"))
library(data.table)
data.table(df.mlt)[(dt - variable) %between% c(0, 190), mean(value), by=list(lat, lon, dt)]

看看df.mlt我所说的长格式是什么意思(基本上,列变成了行)。第二个命令只是将两列dtvariablevariable保存融化前的列的名称)转换为日期格式。最后,我data.table用来选择适当的行(日期差异必须小于 190,假设您的数据是每月的,这应该是安全的,我将其作为六个月的代理)并计算行组的统计信息(您也可以使用dplyr或其他“拆分/应用/组合”风格的技术)。这会产生:

     lat   lon         dt        V1
1: -34.0 144.0 2001-06-01  6.016667
2: -34.5 144.5 2001-07-01 10.314286
3: -35.0 145.0 2001-08-01 16.328571
4: -35.5 145.5 2001-09-01 14.700000
5: -36.0 146.0 2001-10-01 18.214286
6: -36.5 146.5 2001-11-01 20.442857
7: -37.0 147.0 2001-12-01 20.342857

更新:显然我无法计算:根据您的问题,这些是六个月的平均值。

于 2014-03-03T01:46:13.833 回答