【问题标题】:Filter different variables based on different conditions根据不同的条件过滤不同的变量
【发布时间】:2018-05-01 17:52:24
【问题描述】:

我有一个深层嵌套的数据和一个通过 purrr 在其上运行的函数。这是一个类似于我的案例的模拟数据和分析:

df <- tibble::tribble(
     ~A, ~B, ~C,
    "e", 2L, 6L,
    "e", 5L, 8L,
    "e", 5L, 3L,
    "f", 3L, 8L,
    "f", 4L, 1L,
    "f", 5L, 6L,
    "g", 3L, 9L,
    "g", 4L, 2L,
    "g", 5L, 7L,
    "h", 5L, 4L
    )

我需要根据不同的条件过滤不同的变量。我需要做这样的事情:

df1 <- df %>% group_by(A) %>% 
              nest() %>% 
              case_when(A == "e" ~filter(B<4),
              A == "f" ~filter(C<=6),
              A == "g" ~filter(B<5, C<7))

我想要的输出应该是:

desired_output <- tibble::tribble(
                     ~A, ~B, ~C,
                    "e", 2L, 6L,
                    "f", 4L, 1L,
                    "f", 5L, 6L,
                    "g", 4L, 2L
                    )

【问题讨论】:

  • 请看我的帖子。我们有不同的输出。我相信这可能是因为你错过了一些条件。

标签: r tidyverse purrr


【解决方案1】:

我们可以针对不同的条件进行如下过滤。

library(tidyverse)

df %>%
  filter((A %in% "e" & B < 4)  | 
           (A %in% "f" & C <= 6) |
           (A %in% "g" & B < 5 & C < 7))  
# # A tibble: 4 x 3
#   A         B     C
#   <chr> <int> <int>
# 1 e         2     6
# 2 f         4     1
# 3 f         5     6
# 4 g         4     2

【讨论】:

    【解决方案2】:

    一个选项可以是:

    df1 <- df %>% group_by(A) %>% 
      mutate(filterV = case_when(
        A == "e" ~ (B<4),
        A == "f" ~ (C<=6),
        A == "g" ~ (B<5 & C<7))) %>%
      filter(filterV) %>%
      select(-filterV)
    
    df1
    # # A tibble: 4 x 3
    # # Groups: A [3]
    #   A         B     C
    #  <chr> <int> <int>
    # 1 e         2     6
    # 2 f         4     1
    # 3 f         5     6
    # 4 g         4     2
    

    【讨论】:

    • 好。我们有同样的结果。我认为 OP 可能会错过一些需要指定的条件。
    • @www 那是真的。我认为我们的结果与 OP 的结果相匹配,但事实并非如此。
    • @www 我手动检查了值。我们的结果与相关描述相符。
    • 感谢您这样做。我猜 OP 对 C 列有一些要求。但即便如此,OP 也可以毫不费力地修改我们的解决方案。
    • 是的,你是对的,我的错。我的条件是: df1 %>% case_when(A == "e" ~filter(B
    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多