当我基于lag()函数过滤数据集时,我丢失了每个组中的第一行(因为这些行没有滞后值)。我怎样才能避免这种情况,以便尽管没有任何滞后值,我仍保留第一行?
ds <-
structure(list(mpg = c(21, 21, 21.4, 18.7, 14.3, 16.4), cyl = c(6,
6, 6, 8, 8, 8), hp = c(110, 110, 110, 175, 245, 180)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -6L), .Names = c("mpg",
"cyl", "hp"))
# example of filter based on lag that drops first rows
ds %>%
group_by(cyl) %>%
arrange(-mpg) %>%
filter(hp <= lag(hp))
答案 0 :(得分:2)
让filter(hp <= lag(hp))
排除lag(hp)
为NA
的行。您可以为 过滤或{/ 1>}的或,就像每个组的顶行一样。
我包含lag(hp)
为滞后创建独立变量,仅为了清晰起见而且调试。
prev = lag(hp)
这会产生:
library(tidyverse)
ds %>%
group_by(cyl) %>%
arrange(-mpg) %>%
mutate(prev = lag(hp)) %>%
filter(hp <= prev | is.na(prev))
答案 1 :(得分:2)
由于OP
打算将<=
(小于或等于)与之前的值一起使用,因此将lag
与default = +Inf
一起使用就足够了。
此外,由于arrange
提供了选择dplyr
的选项,因此无需在lag
链中进行单独的order_by
来电。
因此,解决方案可以写成:
ds %>%
group_by(cyl) %>%
filter(hp <= lag(hp, default = +Inf, order_by = -mpg))
#Below result is in origianl order of the data.frame though lag was calculated
#in ordered value of mpg
# # A tibble: 4 x 3
# # Groups: cyl [2]
# mpg cyl hp
# <dbl> <dbl> <dbl>
# 1 21.0 6.00 110
# 2 21.0 6.00 110
# 3 21.4 6.00 110
# 4 18.7 8.00 175