dplyr :: filter()基于dplyr :: lag()而不会丢失第一个值

时间:2018-04-25 18:43:04

标签: r dplyr lag lead

当我基于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))

2 个答案:

答案 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打算将<=(小于或等于)与之前的值一起使用,因此将lagdefault = +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