2016-12-26 2 views
0

私は最後の値でサブセットする必要がある非常に大きなデータフレームを持っています。 data.tableライブラリには配列の最後の値を返すlast()関数が含まれていますが、trackの各別の値に対してidの最後の値でサブセットfooが必要です。 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 

...とそう

にどのように1本の出力を生成するためにlast()機能(またはtail()のような別の関数)を適用するのでしょうか?

答えて

1

data.tableを使用できます。また、約「ID」と別の論理を述べたように「トラック」によってグループ化(setDT(df1))「data.table」から「data.frame」は、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で試すことができますdplyr

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

あるを使用してこれを行うことができますを選択し、すべてのグループの最後の行のみを選択します。

library(dplyr) 
df %>% 
    group_by(track) %>% 
    filter(row_number() == n()) 
関連する問題