根据列的名称为每行r指定一个值

根据列的名称为每行r指定一个值,r,dataframe,gis,data-manipulation,r-raster,R,Dataframe,Gis,Data Manipulation,R Raster,大家好 我有一个data.frame,其中包含许多列数据,但是,对于每一行,我只对这些列的子集感兴趣。我想使用另一个特定值来标识我感兴趣的列。然后我将取感兴趣的列和前面5列的平均值 My data.frame包括点位置、采集月份以及从1996-2012年间每个点的一组月度光栅中提取的值。对于每一点,我感兴趣的是采集日期前六个月的平均值,例如,如果我在200106(06/2001)中记录了一个变量,我想要200101-200106之间的光栅平均值 收集日期值的编码与对应于为同一月份提取的值的列名相

大家好

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

My 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))

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

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)]

更新:显然我数不清:根据你的问题,这是六个月的平均值。

日期应该在行和列中吗?@6pool是的。dt列是收集数据点的日期。以日期作为列名的列对应于从中提取列值的光栅文件。我想使用我的dt值来查找“dt”行中包含的相应光栅数据。这让人困惑,我不善于解释我想做的事情,我为此道歉。亚当,我下面的回答没有按照你的要求做吗?还是我误会了?谢谢BrodieG这正是我想要的。它与我的数据配合得非常好。。。尽管我仍在努力了解data.table的内容。这肯定会在我将来做的事情中派上用场。干杯
     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