按组选择每次运行零之前的最后一个非零值
我有以下数据框:
variable Date values values2
1 a 2017-01-01 3 1
2 a 2017-01-02 4 2
3 a 2017-01-03 5 1 # non-zero followed by zero
4 a 2017-01-04 0 2
5 a 2017-01-05 0 2
6 a 2017-01-06 0 3
7 b 2017-01-01 10 1
8 b 2017-01-02 11 2
9 b 2017-01-03 12 2
10 b 2017-01-04 13 3
11 b 2017-01-05 14 0
12 b 2017-01-06 15 1
13 c 2017-01-01 45 2
14 c 2017-01-02 50 3 # non-zero followed by zero
15 c 2017-01-03 0 0
16 c 2017-01-04 0 2
17 c 2017-01-05 10 1 # non-zero followed by zero
18 c 2017-01-06 0 1
我想在“值”列中选择非零值后跟零的行:
1 a 2017-01-03 5 1
2 c 2017-01-02 50 3
3 c 2017-01-05 10 1
请注意,一个变量中可能出现多个最后一个非零值。
我的代码不能正常工作,因为每个变量只有最后一个元素:
test_df <- structure(list(variable = c("a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "c", "c", "c", "c", "c","c"),
Date = structure(c(17167, 17168, 17169, 17170, 17171, 17172, 17167, 17168, 17169, 17170, 17171, 17172, 17167, 17168, 17169, 17170, 17171, 17172), class = "Date"),
values = c(3, 4, 5, 0, 0, 0, 10, 11, 12, 13, 14, 15, 45, 50,0, 0, 10, 0),
values2 = c(1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 0, 1, 2, 3, 0, 2, 1, 1)),
row.names = c(NA, -18L), class = "data.frame", .Names = c("variable", "Date", "values", "values2"))
test_df %>%
group_by(variable=factor(variable)) %>%
filter(any(values==0)) %>%
filter(values != 0) %>%
arrange(Date) %>%
slice(n()) %>%
ungroup()
1 a 2017-01-03 5 1
2 c 2017-01-05 10 1
回答
此解决方案还可以帮助您解决此问题:
library(dplyr)
test_df %>%
group_by(variable) %>%
filter(values != 0 & lead(values) == 0)
variable Date values values2
1 a 2017-01-03 5 1
2 c 2017-01-02 50 3
3 c 2017-01-05 10 1