2014-03-25 2 views
0

У меня есть кадр данных, содержащий месячные значения NDVI с 2000-2012 для 26 станций. Сначала я отсортировал свой файл данных по году, затем станцию ​​и, наконец, ndvi.Извлечение наивысших значений из столбца в временном интервале dataframe

Мой dataframe 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) 

Однако, я получаю только кадр данных с тремя верхними рядами станций ndvi в 2000 году, а не через годы после этого.

Кто-нибудь знает, как я могу это исправить?

спасибо.

+0

Пожалуйста, разместите небольшой образец данных. Но могли бы вы использовать 'head (sort (R $ station), 3)' возможно? –

+0

Согласен, воспроизводимый пример поможет всем: http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

ответ

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 s быстрее с помощью клавиш, но я опускаю, что для ясности здесь.


данных:

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

большое спасибо !!! – user3460660

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 
+0

Благодарим вас за помощь! – user3460660

Смежные вопросы