2016-12-26 143 views
0

我有一个非常大的数据框,需要按最后的值进行子集划分。我知道data.table库包含返回数组最后一个值的last()函数,但我需要的是将foo的子集中的最后一个值用于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] 

由于还提到另一个逻辑与“ID”有关连续的数字,我们也可以使用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尝试,通过分组并只选择每组的最后一行。

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