2016-02-19 3 views
0

У меня есть структура данных метрик растительности, собранная на х единиц и у станций отбора проб (несколько станций внутри каждой единицы) в течение нескольких лет. Я хочу выбрать все данные о растительности для каждой единицы за последний год, когда были собраны данные. Вот пример моего кадра данных:Выбор строк по последнему году

veg <- c("tree","grass","tree","grass","tree","grass","tree","grass") 
cover <- c(0.97,0.21,0.35,0.67,0.45,0.72,0.27,0.67) 
unit <- c("U1","U1","U1","U1","U2","U2","U2","U2") 
station <- c("A1","A1","A2","A2","A3","A3","A4","A4") 
year <- c(2015,2015,2014,2014,2013,2013,2014,2014) 
df <- data.frame(veg,cover,unit,station,year) 

Фрейм данных выглядит следующим образом:

veg cover unit station year 
1 tree 0.97 U1  A1 2015 
2 grass 0.21 U1  A1 2015 
3 tree 0.35 U1  A2 2014 
4 grass 0.67 U1  A2 2014 
5 tree 0.45 U2  A3 2013 
6 grass 0.72 U2  A3 2013 
7 tree 0.27 U2  A4 2014 
8 grass 0.67 U2  A4 2014 

Я хочу, чтобы выглядеть следующим образом:

veg cover unit station year 
1 tree 0.97 U1  A1 2015 
2 grass 0.21 U1  A1 2015 
3 tree 0.27 U2  A4 2014 
4 grass 0.67 U2  A4 2014 

Любая помощь будет много оценили.

+0

Почему вы не хотите последних лет? Вы хотите определить «последний год»? – MaxPD

ответ

0

Как это сделать без какой-либо упаковки.

df.by  = by(df, df$unit, FUN = function(t) t[t$year == max(t$year),]) 
df.recent = Reduce(function(...) merge(..., all=T), df.by) 
df.recent 

Выход

>  df.recent 
    veg cover unit station year 
1 grass 0.21 U1  A1 2015 
2 grass 0.67 U2  A4 2014 
3 tree 0.27 U2  A4 2014 
4 tree 0.97 U1  A1 2015 

В первой строке, мы используем функцию by подмножеству кадр данных на коэффициент df$unit. Для каждого подмножества (для каждой единицы) мы извлекаем строку последнего года анонимной функцией function(t) t[t$year == max(t$year),]).

df.by - это список фреймов данных, который содержит только строки последнего года для каждого устройства.

Для второй линии мы используем функцию merge для объединения всего кадра данных в df.by. Использование этого кода объясняется в Simultaneously merge multiple data.frames in a list.

+0

Спасибо, что сделал трюк. – omwrichmond

0

Это ответ на ваш вопрос, вы хотите, чтобы самые последние из veg/unit правильно?

library(dplyr) 
df %>% 
    group_by(veg, unit) %>% 
    arrange(desc(year)) %>% 
    slice(1) 
Смежные вопросы