【问题标题】:Filtering Rows by Matching Column Value to Other Column Value in R通过将列值与 R 中的其他列值匹配来过滤行
【发布时间】:2019-02-27 21:36:02
【问题描述】:

我对 R 很陌生,所以这可能比预期的要容易,我可能想多了。假设我有一个 data.frame (df),并且我想从另一列中选择与标准匹配的行,但更重要的是,我需要该标准是一组独有的。例如:

Column1    Column2    Column3 
Name1      Some Val   Criteria1
Name1      Unwanted   Also Unwanted
Name2      Some Val2  Criteria2
Name2      Unwanted   Also Unwanted

这可能会让人感到困惑。但基本上,我想根据每个名称的匹配标准选择每个 Some Val,所以我希望它是:

Column1    Column2    Column3
Name1      Some Val1  Criteria1
Name2      Some Val2  Criteria2

问题是,如果只选择几个名称,这很容易做到。但我有数千个,这意味着要写出数千个名称和数千个不同的标准。

【问题讨论】:

    标签: r select filter


    【解决方案1】:

    使用dplyr 你可以做到

    library(dplyr)
    df %>%
        group_by(Column1) %>%
        filter(str_detect(Column2, "Some Val"))
    ## A tibble: 2 x 3
    ## Groups:   Column1 [2]
    #  Column1 Column2   Column3
    #  <fct>   <fct>     <fct>
    #1 Name1   Some Val  Criteria1
    #2 Name2   Some Val2 Criteria2
    

    样本数据

    df <- read.table(text =
        "Column1    Column2    Column3
    Name1      'Some Val'   Criteria1
    Name1      Unwanted   'Also Unwanted'
    Name2      'Some Val2'  Criteria2
    Name2      Unwanted   'Also Unwanted'", header = T)
    

    【讨论】:

      【解决方案2】:

      如果您想根据组特定条件从组中选择行,您将需要某种对象来指定每个组的条件。您可以使用 data.frame(以下代码中的criteria_by_group)来执行此操作。

      library(dplyr)
      #> 
      #> Attaching package: 'dplyr'
      #> The following objects are masked from 'package:stats':
      #> 
      #>     filter, lag
      #> The following objects are masked from 'package:base':
      #> 
      #>     intersect, setdiff, setequal, union
      library(tibble)
      
      df <- tribble(
        ~group_col, ~value_col, ~criteria_col,
        "Name1", "Some Val", "Criteria1",
        "Name1", "Unwanted", "Not Criteria1",
        "Name2", "Some Val2", "Criteria2", 
        "Name2", "Unwanted", "Not Criteria2"
      )
      
      criteria_by_group <- tribble(
        ~group_col, ~group_criteria,
        "Name1", "Criteria1",
        "Name2", "Criteria2"
      )
      
      df <- left_join(df, criteria_by_group, by = "group_col")
      
      df
      #> # A tibble: 4 x 4
      #>   group_col value_col criteria_col  group_criteria
      #>   <chr>     <chr>     <chr>         <chr>         
      #> 1 Name1     Some Val  Criteria1     Criteria1     
      #> 2 Name1     Unwanted  Not Criteria1 Criteria1     
      #> 3 Name2     Some Val2 Criteria2     Criteria2     
      #> 4 Name2     Unwanted  Not Criteria2 Criteria2
      
      df %>%
        group_by(group_col) %>%
        filter(criteria_col == group_criteria[1])
      #> # A tibble: 2 x 4
      #> # Groups:   group_col [2]
      #>   group_col value_col criteria_col group_criteria
      #>   <chr>     <chr>     <chr>        <chr>         
      #> 1 Name1     Some Val  Criteria1    Criteria1     
      #> 2 Name2     Some Val2 Criteria2    Criteria2
      

      reprex package (v0.2.1) 于 2019 年 2 月 27 日创建

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2021-12-29
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多