【问题标题】:R filter rows such that one column is conditional on two other columnsR过滤行,使得一列以另外两列为条件
【发布时间】:2022-01-14 20:40:59
【问题描述】:

我的数据集如下:

df <- tibble(id = c("firm a","firm b","firm c","firm d","firm e","firm a","firm e","firm b","firm f","firm g"), 
                     n1 = c(1,1,1,1,1,0,0,0,0,0), 
                     n2 = c(0,0,0,0,0,1,1,1,1,1))
       id        n1    n2
       <chr>  <dbl> <dbl>
     1 firm a     1     0
     2 firm b     1     0
     3 firm c     1     0
     4 firm d     1     0
     5 firm e     1     0
     6 firm a     0     1
     7 firm e     0     1
     8 firm b     0     1
     9 firm f     0     1
    10 firm g     0     1

我只想过滤变量 idboth 变量 n1 中的值 1 和变量 n2 中的值 1 相关联的行。

在本例中,满足此条件的三行是“公司 a”、“公司 b”和“公司 e”。

我曾尝试在dplyr 中使用filter 函数,但我找不到如何根据其他两个变量中的值来调节一个变量。

【问题讨论】:

    标签: r dplyr filter conditional-statements


    【解决方案1】:

    在排列id 列后,我们可以使用lead 函数,然后使用if_all 进行过滤:

    library(dplyr)
    df %>% 
      arrange(id) %>% 
      mutate(n2=lead(n2, default = n2[1])) %>% 
      filter(if_all(n1:n2, ~ . == 1))
    
      id        n1    n2
      <chr>  <dbl> <dbl>
    1 firm a     1     1
    2 firm b     1     1
    3 firm e     1     1
    

    【讨论】:

      【解决方案2】:
      df %>%
        group_by(id) %>%
        filter(any(n1 == 1), any(n2 == 1))
      
      # A tibble: 6 x 3
      # Groups:   id [3]
        id        n1    n2
        <chr>  <dbl> <dbl>
      1 firm a     1     0
      2 firm b     1     0
      3 firm e     1     0
      4 firm a     0     1
      5 firm e     0     1
      6 firm b     0     1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        • 2021-06-25
        • 1970-01-01
        • 2019-08-02
        • 2013-09-06
        相关资源
        最近更新 更多