【问题标题】:Filtering in tidyverse based on a vector/list of possible values基于可能值的向量/列表在 tidyverse 中进行过滤
【发布时间】:2019-10-07 09:19:39
【问题描述】:

我想根据应标识唯一行的两列上的条件选择数据框的行。在下面的具体示例中,我想选择 id=1,2,3... 具有在向量中指定的特定 mtry 值,即对于 id=1,我只想要 mtry=3 的第一行,对于 id=2,我想要 mtry=5

我尝试使用group_byfilter,例如

filter(df, (mtry,id) %in% c([3,1],[5,2],[3,3]))

但这会报错

错误:意外的“,”在。

tidyverse 的做法是什么?

【问题讨论】:

    标签: r dataframe tidyverse


    【解决方案1】:

    您可以使用内部连接来执行这种过滤器

    library(dplyr)
    
    df %>% 
      inner_join(tibble(mtry = c(3, 5, 3), id = c(1, 2, 3)))
    

    例子:

    set.seed(100)
    df <- data.frame(mtry = sample(1:3, 100, T), id = sample(1:5, 100, T))
    
    df %>% 
      inner_join(tibble(mtry = c(3, 5, 3), id = c(1, 2, 3)))
    # Joining, by = c("mtry", "id")
    #    mtry id
    # 1     3  1
    # 2     3  3
    # 3     3  3
    # 4     3  3
    # 5     3  1
    # 6     3  3
    # 7     3  1
    # 8     3  1
    # 9     3  1
    # 10    3  3
    # 11    3  1
    # 12    3  3
    # 13    3  1
    

    【讨论】:

      【解决方案2】:

      你需要为每个组合创造不同的条件

      subset(df, (mtry == 3 & id == 1) | (mtry == 5 & id == 2) | (mtry == 3 & id == 3))
      

      或者如果你想tidyverse 把条件放在filter

      library(dplyr)
      
      df %>% filter((mtry == 3 & id == 1) | (mtry == 5 & id == 2) | (mtry == 3 & id == 3))
      

      你可以结合条件1和3做

      df %>% filter((mtry == 3 & id %in% c(1, 3)) | (mtry == 5 & id == 2))
      

      【讨论】:

      • 谢谢。如果我有一个带条件的向量而不使用循环,我该怎么做?
      • @Mac 如果您只在共享示例中限制条件检查,您可以执行df %&gt;% filter((mtry == vec1[1] &amp; id %in% vec2[1:2]) | (mtry == vec1[2] &amp; id == vec[3])) 其中vec1vec2 是您的向量。如果您有很多条件,IceCreamTouCan 的其他答案会有所帮助。
      猜你喜欢
      • 2023-02-24
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多