【问题标题】:identify a column by its name for a specified value for each row, r通过名称为每一行的指定值标识一列,r
【发布时间】:2014-03-03 01:10:39
【问题描述】:

大家好,

我有一个包含许多数据列的 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(日期)我可以得到相应列的六个月平均值吗?

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

干杯, 亚当

【问题讨论】:

  • 日期应该在行和列中吗?
  • @6pool 是的。 dt 列是收集数据点的日期。日期为 col.names 的列对应于从中提取列值的栅格文件。我想使用我的 dt 值来查找“dt”行中包含的相应栅格数据。这令人困惑,我不善于解释我想要做什么,对此我深表歉意。
  • 亚当,我下面的回答不符合您的要求吗?还是我误会了?

标签: r dataframe gis data-manipulation r-raster


【解决方案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 以了解我所说的长格式是什么意思(基本上,列变成了行)。第二个命令只是将dtvariable 两列(variable 保存融化前的列名称)转换为日期格式。最后,我使用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

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

【讨论】:

  • 感谢 BrodieG,这正是我想要的。它对我的数据非常有效......尽管我仍在努力了解 data.table 的内容。这对于我将来要做的事情肯定会派上用场。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2021-06-12
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
相关资源
最近更新 更多