【问题标题】:Remove non-last rows with certain condition per group删除每组具有特定条件的非最后一行
【发布时间】:2022-11-29 20:30:27
【问题描述】:

我有以下名为 df 的数据框(dput 下面):

  group indicator value
1     A     FALSE     2
2     A     FALSE     1
3     A     FALSE     2
4     A      TRUE     4
5     B     FALSE     5
6     B     FALSE     1
7     B      TRUE     3

我想删除每组 indicator == FALSE 的非最后一行。这意味着在 df 中,应删除行:1,2 和 5,因为它们不是每组 FALSE 的最后一行。这是所需的输出:

  group indicator value
1     A     FALSE     2
2     A      TRUE     4
3     B     FALSE     1
4     B      TRUE     3

所以我想知道是否有人知道如何删除 R 中每组具有特定条件的非最后一行?


df 的dput

df <- structure(list(group = c("A", "A", "A", "A", "B", "B", "B"), 
    indicator = c(FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE
    ), value = c(2, 1, 2, 4, 5, 1, 3)), class = "data.frame", row.names = c(NA, 
-7L))

【问题讨论】:

  • @AnoushiravanR,我的错,应该是 FALSE 指标。我在问题中更改了它。
  • @AnoushiravanR,因为第 3 行是 FALSE 的最后一行。我想保留每组最后一行的所有 FALSE。这就是为什么不删除第 3 行和第 6 行的原因。
  • 最后一行指示符总是 TRUE 还是也可能为 FALSE?
  • @AnoushiravanR,TRUE 的行应该什么都不会发生。所以他们需要留下来。

标签: r dataframe dplyr


【解决方案1】:

您可以使用 lead 执行此操作,并检查即将到来的指标是否为 TRUE

library(tidyverse)
df <- structure(list(group = c("A", "A", "A", "A", "B", "B", "B"), 
                     indicator = c(FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE
                     ), value = c(2, 1, 2, 4, 5, 1, 3)), class = "data.frame", row.names = c(NA, 
                                                                                             -7L))
df |> 
  group_by(group) |> 
  mutate(slicer = if_else(lead(indicator) ==F, 1, 0)) |> 
  mutate(slicer = if_else(is.na(slicer), 0 , slicer)) |> 
  filter(slicer == 0) |> 
  select(-slicer)
#> # A tibble: 4 × 3
#> # Groups:   group [2]
#>   group indicator value
#>   <chr> <lgl>     <dbl>
#> 1 A     FALSE         2
#> 2 A     TRUE          4
#> 3 B     FALSE         1
#> 4 B     TRUE          3

【讨论】:

    【解决方案2】:

    这可能有助于:

    library(dplyr)
    
    df %>% 
      group_by(group) %>% 
      filter(indicator | ((row_number() == n() - 1) & !indicator))
    
    # A tibble: 4 × 3
    # Groups:   group [2]
      group indicator value
      <chr> <lgl>     <dbl>
    1 A     FALSE         2
    2 A     TRUE          4
    3 B     FALSE         1
    4 B     TRUE          3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-25
      • 2021-08-17
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2020-04-12
      • 2021-04-01
      • 1970-01-01
      相关资源
      最近更新 更多