【问题标题】:filter data frame based on multiple dynamic conditons, which depend on a subset of the data, eg. via applying a loop基于多个动态条件过滤数据帧,这些条件取决于数据的子集,例如。通过应用循环
【发布时间】:2021-06-19 08:51:17
【问题描述】:

我有数百个名称和每个名称数百个值的数据框。现在我想根据仅适用于数据的某个子集的一些数学规则过滤一些值。一个简化的示例将过滤每个名称的最大值。

我可以如下所示对其进行硬编码,但希望避免使用它。

library(dplyr)
##
names <- c('A', 'A', 'B', 'B')
values <- c(1,2,3,4)
df <- data.frame(names, values)
##
df%>%filter(names!='A' | values!=max(subset(df, names =='A')$values)
            ,names!='B' | values!=max(subset(df, names =='B')$values))

期望的输出:

  names values
1     A      1
2     B      3

我会考虑在 dplyr 过滤器中创建一个循环,计算每个名称的最大值,然后在可能的情况下在过滤器中应用这两个条件。

【问题讨论】:

    标签: r loops filter dynamic dplyr


    【解决方案1】:

    base R 中的一个选项

    subset(df, values != ave(values, names, FUN = max))
    

    【讨论】:

      【解决方案2】:

      过滤掉每个名字的最大值:

      df %>% 
        group_by(names) %>%
        filter(values != max(values))
      
      # # A tibble: 2 x 2
      # # Groups:   names [2]
      #   names values
      #   <chr>  <dbl>
      # 1 A          1
      # 2 B          3
      

      或者,如果您的意思是从整个数据框中删除每个名称的最大值,只要它们出现:

      df %>% 
        group_by(names) %>%
        slice_max(values) %>%
        select(values) %>%
        anti_join(df, ., by = "values")
      
      # # A tibble: 2 x 2
      # # Groups:   names [2]
      #   names values
      #   <chr>  <dbl>
      # 1 A          1
      # 2 B          3
      

      【讨论】:

      • 昨天我好像有点脑筋急转弯:-)。好吧,我在这里过度简化了我的示例,使其与我最初的问题不匹配。无论如何,你在这里解决了问题,我解决了我的问题.-)。
      猜你喜欢
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 2018-12-06
      相关资源
      最近更新 更多