从时间序列数据帧中的列中提取最高值

时间:2014-03-25 16:51:05

标签: r

我有一个数据框,其中包含2000年至2012年的26个台站的NDVI值。我根据年份,然后站点和最后ndvi对数据帧进行了排序。

我的数据框R看起来像这样(抱歉格式化):

t  station  year  month ndvi   altitude precipitation  
8   a   2000    aug  0.7793 2143    592.9  
9   a   2000    sept 0.7524 2143    135.3  
10  a   2000    oct  0.6597 2143    77.5  
4   a   2000    apr 0.6029  2143    72.6  
7   a   2000    jul 0.6018  2143    606.1  
11  a   2000    nov 0.5801  2143    4.4  
12  a   2000    dec 0.5228  2143    0  
6   a   2000    jun 0.4969  2143    505.9  
5   a   2000    may 0.4756  2143    241.7  
2   a   2000    feb 0.4396  2143    4  
3   a   2000    mar 0.4393  2143    25.5  
1   a   2000    jan 0.4138  2143    16  
8   b   2000    aug 0.7523  122 832.3  
9   b   2000    sept    0.7003  122 229.7  
7   b   2000    jul 0.667   122 662  
5   b   2000    may 0.6639  122 323.3  
4   b   2000    apr 0.593   122 88.6  
6   b   2000    jun 0.5508  122 752.1  

我需要每年为每个电台提取前三个ndvi行并尝试使用此代码:

top3 <- split(R, R$station)
subsetted.data <- lapply(top3, FUN = function(x) head(x, 3))
subsetted.data
flatten.data <- do.call("rbind", subsetted.data)
View(flatten.data)

然而,我只在2000年获得了具有前三个ndvi行的数据帧,而不是几年之后。

有谁知道如何解决这个问题?

谢谢。

2 个答案:

答案 0 :(得分:1)

您需要通过电台和年份的互动进行拆分:

R <- R[order(R$ndvi, decreasing=T), ]
top3 <- split(R, interaction(R$station, R$year))   # <<<<<<<<<< this is the change
subsetted.data <- lapply(top3, FUN = function(x) head(x, 3))
subsetted.data
flatten.data <- do.call("rbind", subsetted.data)

这有效(最后参见我的数据)。也就是说,使用像data.table这样的包来处理这类事情更容易:

library(data.table)
data.table(R)[order(ndvi, decreasing=T), head(.SD, 3), by=list(station, year)]

请注意,您可以使用密钥更快地订购data.table,但为了清楚起见,我省略了这一点。


数据:

set.seed(1)
R <- expand.grid(year=2000:2010, station=letters[1:5], month=month.abb)
R$ndvi <- runif(nrow(R))

答案 1 :(得分:0)

我插入了一些任意的“2001”年来展示分离。我更倾向于order感兴趣的列第一个,然后是split。如果您愿意,可以在结果上使用do.call(rbind, ...)。结果是按年排名前三位的“ndvi”。

> dat$year[c(8:12, 16:18)] <- 2001  ## add some 2001 years
> ord <- dat[order(-dat$ndvi), ]
> lapply(split(ord, list(ord$station, ord$year)), head, 3)
$a.2000
   t station year month   ndvi altitude precipitation
1  8       a 2000   aug 0.7793     2143         592.9
2  9       a 2000  sept 0.7524     2143         135.3
3 10       a 2000   oct 0.6597     2143          77.5

$b.2000
   t station year month   ndvi altitude precipitation
13 8       b 2000   aug 0.7523      122         832.3
14 9       b 2000  sept 0.7003      122         229.7
15 7       b 2000   jul 0.6670      122         662.0

$a.2001
   t station year month   ndvi altitude precipitation
8  6       a 2001   jun 0.4969     2143         505.9
9  5       a 2001   may 0.4756     2143         241.7
10 2       a 2001   feb 0.4396     2143           4.0

$b.2001
   t station year month   ndvi altitude precipitation
16 5       b 2001   may 0.6639      122         323.3
17 4       b 2001   apr 0.5930      122          88.6
18 6       b 2001   jun 0.5508      122         752.1