我有一个数据框,其中包含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行的数据帧,而不是几年之后。
有谁知道如何解决这个问题?
谢谢。
答案 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