2016-12-26 26 views
0

У меня очень большой фрейм данных, который мне нужно подмножество по последним значениям. Я знаю, что библиотека data.table включает в себя функцию last(), которая возвращает последнее значение массива, но мне нужно подмножество foo на последнее значение в id для каждого отдельного значения в track. Значения в id являются целыми целыми числами, но последние значения будут разными для каждого track.Найти последние значения по условию

> head(foo) 
    track id coords.x coords.y 
1  0 0 -79.90732 43.26133 
2  0 1 -79.90733 43.26124 
3  0 2 -79.90733 43.26124 
4  0 3 -79.90733 43.26124 
5  0 4 -79.90725 43.26121 
6  0 5 -79.90725 43.26121 

Результат будет выглядеть примерно так.

track id coords.x coords.y 
1  0 57 -79.90756 43.26123 
2  1 98 -79.90777 43.26231 
3  2 61 -79.90716 43.26200 

... и так далее

Как бы один применить last() функции (или другую функцию, как tail()) для получения этого результата?

ответ

1

Мы можем использовать data.table. Преобразование «data.frame» в «data.table» (setDT(df1)), сгруппированный по «дорожке» получить последнюю строку с tail

library(data.table) 
setDT(df1)[, tail(.SD, 1), by = track] 

Как также отметил другую логику с «ид» о последовательные числа, мы также можем создать логический индекс, используя diff, получить индекс строки (.I) и подмножество строк.

setDT(df1)[df1[, .I[c(FALSE, diff(id) ! = 1)], by = track]$V1] 

Или мы можем сделать это с помощью base R сам

df1[!duplicated(df1$track, fromLast=TRUE),] 

Или другой вариант dplyr

library(dplyr) 
df1 %>% 
    group_by(track) %>% 
    slice(n()) 
1

Мы можем попытаться с dplyr, группировка по track и выберите только последнюю строку каждой группы.

library(dplyr) 
df %>% 
    group_by(track) %>% 
    filter(row_number() == n())