dplyr::filter() 基于 dplyr::lag() 而不会丢失第一个值
dplyr::filter() based on dplyr::lag() without losing first values
当我根据 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))
filter(hp <= lag(hp))
会排除 lag(hp)
为 NA
的行。您可以过滤 either 不等式 或 lag(hp)
,每个组的顶部行就是这种情况。
我包含 prev = lag(hp)
来为滞后创建一个独立变量,只是为了清楚和调试。
library(tidyverse)
ds %>%
group_by(cyl) %>%
arrange(-mpg) %>%
mutate(prev = lag(hp)) %>%
filter(hp <= prev | is.na(prev))
这产生:
# A tibble: 4 x 4
# Groups: cyl [2]
mpg cyl hp prev
<dbl> <dbl> <dbl> <dbl>
1 21.4 6. 110. NA
2 21.0 6. 110. 110.
3 21.0 6. 110. 110.
4 18.7 8. 175. NA
由于 OP
打算使用 <=
(小于或等于)之前的值,因此使用 lag
和 default = +Inf
就足够了。
此外,不需要在 dplyr
链中单独调用 arrange
,因为 lag
为 select order_by
.[=19 提供了选项=]
因此,解可以写成:
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
当我根据 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))
filter(hp <= lag(hp))
会排除 lag(hp)
为 NA
的行。您可以过滤 either 不等式 或 lag(hp)
,每个组的顶部行就是这种情况。
我包含 prev = lag(hp)
来为滞后创建一个独立变量,只是为了清楚和调试。
library(tidyverse)
ds %>%
group_by(cyl) %>%
arrange(-mpg) %>%
mutate(prev = lag(hp)) %>%
filter(hp <= prev | is.na(prev))
这产生:
# A tibble: 4 x 4
# Groups: cyl [2]
mpg cyl hp prev
<dbl> <dbl> <dbl> <dbl>
1 21.4 6. 110. NA
2 21.0 6. 110. 110.
3 21.0 6. 110. 110.
4 18.7 8. 175. NA
由于 OP
打算使用 <=
(小于或等于)之前的值,因此使用 lag
和 default = +Inf
就足够了。
此外,不需要在 dplyr
链中单独调用 arrange
,因为 lag
为 select order_by
.[=19 提供了选项=]
因此,解可以写成:
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