按条件查找最后一个值
Find last values by condition
我有一个非常大的数据框,需要按最后的值进行子集化。我知道 data.table
库包含 last()
函数,它 returns 数组的最后一个值,但我需要的是 foo
子集 foo
中的最后一个值15=] 对于 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()
等其他函数)来生成此输出?
我们可以使用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())
我们可以尝试 dplyr
,按 track
分组并只选择每组的最后一行。
library(dplyr)
df %>%
group_by(track) %>%
filter(row_number() == n())
我有一个非常大的数据框,需要按最后的值进行子集化。我知道 data.table
库包含 last()
函数,它 returns 数组的最后一个值,但我需要的是 foo
子集 foo
中的最后一个值15=] 对于 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()
等其他函数)来生成此输出?
我们可以使用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())
我们可以尝试 dplyr
,按 track
分组并只选择每组的最后一行。
library(dplyr)
df %>%
group_by(track) %>%
filter(row_number() == n())