【问题标题】:Filtering out with conditions of descending priority过滤掉优先级递减的条件
【发布时间】:2021-08-22 16:23:03
【问题描述】:

我无法根据优先级降序的条件选择行。我试过找出解决方案,但就是做不到。这似乎是一项简单的任务,但我就是想不通。

这只是我想做的一个一般示例。

structure(list(type = c(100815L, 100815L, 100815L, 100815L, 
100815L, 100815L, 100815L), x = structure(c(1L, 
1L, 1L, 2L, 1L, 2L, 2L), .Label = c("No", "Yes"), class = "factor"), 
    y = c(1.51098844290943, 2.31001922745969, 1.52639281812227, 
    0, 0, 0, 0), z = c(0, 0, 0, 25, 0, 50, 25)), row.names = c(NA, 
-7L), class = c("tbl_df", "tbl", "data.frame"))


group <- group %>%
  group_by(type) %>% 
     filter(sum(x == "Yes" &
                y == min(y[x == "Yes"]) &
                z == max(z[y == min(y[x == "Yes"])])) == 1)

所以基本上我想从一个大样本中过滤出恰好有一个这种情况的组。即没有关系:

  • 当 x =“是”并且
    • 假设 x = "Yes" 选择具有 x = "Yes" 的最小 y 并且
      • 从这个最后的最小组中选择具有最大值的 z。

基本上也有可能不存在这样的最终值。

这是一个我经常遇到的问题的简化示例。我有一个更大的数据集,我需要根据多个优先级递减的条件为单元格分配值。我希望能够按顺序堆叠条件。

更新

structure(list(type = c(7345L, 7345L, 7345L, 7345L, 7345L, 
7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 
7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 7345L, 7345L
), x= structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L
), .Label = c("No", "Yes"), class = "factor"), y = c(1.66703903751618, 
0, 0.899002060282742, 1.77844476717205, 0.858205995526113, 1.77844476717205, 
0.894654725714929, 2.28497216539696, 0, 0.899002060282742, 2.28497216539696, 
2.85895315127563, 2.85895315127563, 0, 2.85895315127563, 0.858205995526113, 
0.894654725714929, 1.66703903751618, 1.66703903751618, 0, 0, 
1.66703903751618, 0.894654725714929), z = c(6.67, 
0, 3.33, 6.67, 3.33, 6.67, 2, 6.67, 3.33, 3.33, 2, 3.33, 3.33, 
2, 3.33, 6.67, 6.67, 6.67, 2, 6.67, 3.33, 6.67, 2)), row.names = c(NA, 
-23L), class = c("tbl_df", "tbl", "data.frame"))

# And the code that I attempted:

test <- test %>%
          group_by(type) %>%
          arrange(type) %>%
          filter(sum(y == min(y)  & x == "Yes") == 1) %>%
          ungroup()

根据我的理解,这里的组应该被过滤掉,但事实并非如此。有两个“是”,但另一个有一个较小的 y,应该只有一个规则发生的情况,但过滤器没有选择它。

这只是一个限制版本,有两个条件。基本上我试图给一个 x 分配一个“是”。如果有多个,则平局被 y 打破。如果还有平局,则平局被 z 打破。我希望如此。我就是无法让它工作。

【问题讨论】:

    标签: r if-statement


    【解决方案1】:

    我想这就是你要找的:

    df %>% group_by(type) %>% filter(x == "Yes",y == min(y),z == max(z))
    
    # # A tibble: 1 × 4
    # # Groups:   type [1]
    #     type x         y     z
    #    <int> <fct> <dbl> <dbl>
    # 1 100815 Yes       0    50 
    

    【讨论】:

    • 我认为这是使用 min(y)max(z) 的全局值,而不是子集中的值。对于样本数据,您会得到相同的答案,但如果没有案例有 x=="Yes"y == 0z == 50,则根本没有案例。将filter 调用拆分为三个单独的调用似乎可以做到。
    • 无论哪种方式我都得到相同的答案,但我没有在替代数据集上对其进行测试。
    • 抱歉延迟响应,我正在检查它是否适用于所有情况。您的解决方案有助于这个特定的群体,但不是全部,我不明白为什么。我将更新帖子以显示该选择规则不起作用的地方。
    • 同时应用过滤器(逗号相当于 AND 逻辑)会导致潜在的损坏:如果 min(y) 值出现在 x == "No" 中,则逻辑中断,并且没有规则保留。将代码更改为三个链接的 filter 调用应该会导致正确的行为。
    • @user2554330 拆分 filter 可以分离值,但副作用是将行与组分开。我正在尝试收集条件成立的组,然后在下一步中将条件不成立的行的 x 更改为“否”。我将更新问题,向您展示我在此步骤之后尝试的内容。
    猜你喜欢
    • 2020-06-21
    • 2017-07-18
    • 2013-06-18
    • 2011-09-29
    • 2020-02-04
    • 2019-04-15
    • 2021-08-27
    • 2019-12-06
    • 1970-01-01
    相关资源
    最近更新 更多