如何过滤掉Z列中最后一个值1之后的所有数据框行?
How to filter out all rows of data frame after the last value of 1 in the column Z?
我有以下数据框:
| Y | Z |
-----------------
62 0
65 0
59 1
66 0
64 1
64 1
57 0
68 1
59 0
60 0
如何过滤掉 Z 列,以便过滤掉最后一次出现值 1 之后的所有“剩余值”(在本例中是最后一个 1 之后的所有零)?在上面的示例中,过滤后的数据框将变为:
| Y | Z |
-----------------
62 0
65 0
59 1
66 0
64 1
64 1
57 0
68 1
此外,我如何对第一个 1 之前的所有值进行过滤(过滤掉它之前的所有值)..?
您可以像这样删除最后一次出现的值之后的所有行:
library(dplyr)
df %>%
slice(1:max(which(Z == 1)))
输出:
Y Z
1 62 0
2 65 0
3 59 1
4 66 0
5 64 1
6 64 1
7 57 0
8 68 1
另一个可能的解决方案:
library(dplyr)
df %>%
filter(!(Z == 0 & data.table::rleid(Z) %>% "%in%"(c(1, max(.)))))
#> Y Z
#> 1 59 1
#> 2 66 0
#> 3 64 1
#> 4 64 1
#> 5 57 0
#> 6 68 1
我有以下数据框:
| Y | Z |
-----------------
62 0
65 0
59 1
66 0
64 1
64 1
57 0
68 1
59 0
60 0
如何过滤掉 Z 列,以便过滤掉最后一次出现值 1 之后的所有“剩余值”(在本例中是最后一个 1 之后的所有零)?在上面的示例中,过滤后的数据框将变为:
| Y | Z |
-----------------
62 0
65 0
59 1
66 0
64 1
64 1
57 0
68 1
此外,我如何对第一个 1 之前的所有值进行过滤(过滤掉它之前的所有值)..?
您可以像这样删除最后一次出现的值之后的所有行:
library(dplyr)
df %>%
slice(1:max(which(Z == 1)))
输出:
Y Z
1 62 0
2 65 0
3 59 1
4 66 0
5 64 1
6 64 1
7 57 0
8 68 1
另一个可能的解决方案:
library(dplyr)
df %>%
filter(!(Z == 0 & data.table::rleid(Z) %>% "%in%"(c(1, max(.)))))
#> Y Z
#> 1 59 1
#> 2 66 0
#> 3 64 1
#> 4 64 1
#> 5 57 0
#> 6 68 1