【问题标题】:Filter by paired criteria in multiple columns按多列中的配对条件过滤
【发布时间】:2019-01-19 19:44:43
【问题描述】:

我有一个如下所示的数据框,并希望按两列中的匹配项进行过滤。

在下面,我想过滤 EMILY AND FEMALE 以及 MICHAEL AND MALE。我可以设置某种列表或数据框,然后用它来过滤吗?

Name,Year,Gender,Count
Emily,2000,Female,25952
Emily,2001,Female,34294
Michael,2000,Male,345697
Michael,2000,Female,4
Michael,2001,Male,185029
Michael,2001,Female,5

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您确实可以定义一个包含感兴趣案例的数据框,然后使用inner_join

    toFilter <- data.frame(Name = c("Emily", "Michael"), Gender = c("Female", "Male"))
    inner_join(df, toFilter)
    Joining, by = c("Name", "Gender")
    #      Name Year Gender  Count
    # 1   Emily 2000 Female  25952
    # 2   Emily 2001 Female  34294
    # 3 Michael 2000   Male 345697
    # 4 Michael 2001   Male 185029
    

    【讨论】:

    • 这正是我想要的。我应该再次审查我的加入!谢谢!
    【解决方案2】:

    怎么样:

    library(tidyverse)
    
    df %>%
    filter( (Name == "Emily" & Gender == "Female") | (Name == "Michael" & Gender == "Male") )
    

    使用的数据:

    df <- read_csv("Name,Year,Gender,Count
             Emily,2000,Female,25952
             Emily,2001,Female,34294
             Michael,2000,Male,345697
             Michael,2000,Female,4
             Michael,2001,Male,185029
             Michael,2001,Female,5")
    

    【讨论】:

    • 这行得通,但我一直在寻找一种更有效或更灵活的方法。
    • 没有基准,但是从经验来看,使用连接进行过滤并不是最有效/最快的方法。就可读性/灵活性而言,这当然是主观的,我理解。
    • 是否可以反向执行 - 即过滤掉 Emily AND Female 和 Michael AND Male?我试过df %&gt;% filter( (Name != "Emily" &amp; Gender != "Female") | (Name != "Michael" &amp; Gender != "Male") ) 但这似乎与上面的结果相同。
    • @LucyWheeler,试试这个:df %&gt;% filter(! ( (Name == "Emily" &amp; Gender == "Female") | (Name == "Michael" &amp; Gender == "Male") ) )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多