按条件查找最后的值

时间:2016-12-26 09:20:10

标签: r subset tail

我有一个非常大的数据框,我需要按最后的值进行子集化。我知道db.collection('users').find({name: {$in: nameArr}, status: { $ne: 'A' }}).toArray(function (resp) { res.json({code: '00', content: resp}); }); 库包含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())来生成此输出?

2 个答案:

答案 0 :(得分:3)

我们可以尝试dplyr,按track进行分组,只选择每个组的最后一行。

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

答案 1 :(得分:1)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df1)),按'track'分组,获取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())