【问题标题】:Filter to remove all rows before a particular value in a specific column, while this particular value occurs several time过滤以删除特定列中特定值之前的所有行,而该特定值出现多次
【发布时间】:2022-01-12 02:40:33
【问题描述】:

我想过滤以删除特定列中特定值之前的所有行。例如,在下面的数据框中,我想删除出现在 x 列中的“1”之前的所有行,因为出现“1”。请注意,“1”的值重复了很多次,我想删除 x 列中“1”之前的“NA”行,关于 a 列。 谢谢

a   b   x
1   1   NA
1   2   NA
1   3   1
1   4   0
1   5   0
1   6   NA
1   7   NA
2   1   NA
2   2   NA
2   3   1
2   4   NA
2   5   0
2   6   0
2   7   NA
3   1   NA
3   2   NA
3   3   NA
3   4   NA
3   5   1
3   6   0
3   7   NA

想要的输出是这样的:

a   b   x
1   3   1
1   4   0
1   5   0
1   6   NA
1   7   NA
2   3   1
2   4   NA
2   5   0
2   6   0
2   7   NA
3   5   1
3   6   0
3   7   NA

【问题讨论】:

  • 您是要立即删除“bob”之前的行还是删除所有行
  • 删除任何鲍勃之前的所有行将删除最后一个鲍勃之前的所有行
  • 这将有助于显示所需的输出 - 特别是在编辑问题后。我们仍然不清楚您想要实现什么。

标签: r filter


【解决方案1】:

这能解决您的问题吗?

library(tidyverse)

dat <- read.table(text = "a   b   x
1   1   NA
1   2   NA
1   3   1
1   4   0
1   5   0
1   6   NA
1   7   NA
2   1   NA
2   2   NA
2   3   1
2   4   NA
2   5   0
2   6   0
2   7   NA
3   1   NA
3   2   NA
3   3   NA
3   4   NA
3   5   1
3   6   0
3   7   NA", header = TRUE)

dat %>%
  group_by(a) %>%
  filter(cummax(!is.na(x)) == 1)
#> # A tibble: 13 × 3
#> # Groups:   a [3]
#>        a     b     x
#>    <int> <int> <int>
#>  1     1     3     1
#>  2     1     4     0
#>  3     1     5     0
#>  4     1     6    NA
#>  5     1     7    NA
#>  6     2     3     1
#>  7     2     4    NA
#>  8     2     5     0
#>  9     2     6     0
#> 10     2     7    NA
#> 11     3     5     1
#> 12     3     6     0
#> 13     3     7    NA

reprex package 创建于 2021-12-07 (v2.0.1)

【讨论】:

  • 当我们要求 OP 进行澄清时,这就是我们的想法。也就是说,我认为如果我们使用 cumsum (如 dat[cumsum(dat$a=='bob')&gt;0,]),您的第一个示例会更清晰一些。不过,目前还不清楚 OP 想要什么。
  • 感谢@GuedesBF; OP 已经用输入/预期输出更新了他们的问题,我相信我的回答现在更符合他们的要求。一如既往地感谢您的建议 - 总是很感激:)
  • 谢谢!!!是的。 dat %>% group_by(a) %>% filter(cummax(!is.na(x)) == 1)。它解决了我的问题
  • 感谢您编辑您的问题以包含所需的详细信息;输入/预期输出使提供解决方案变得更加容易。在此处创建“易于回答”的问题有一些很好的提示:stackoverflow.com/questions/5963269/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2019-05-06
  • 2020-07-08
  • 2021-08-29
  • 1970-01-01
  • 2020-09-23
相关资源
最近更新 更多